我有一个巨大的电影文件目录结构。为了分析该结构,我想复制整个目录结构,即文件夹和文件,但是我不想复制所有电影文件,而我想保留文件名。理想情况下,我会得到带有原始电影文件名的零字节文件。
我尝试然后 rsync 到我没有获取链接文件的远程机器。
任何想法如何在不编写脚本的情况下做到这一点?
您可以使用查找:
find src/ -type d -exec mkdir -p dest/{} \; \
-o -type f -exec touch dest/{} \;
-d
在 () 下查找目录 ( )src/
并在 () 下创建 ( mkdir -p
) 它们dest/
或 ( -o
) 查找文件 ( -f
) 并touch
在dest/
.
这将导致:
dest/src/<file-structre>
您可以mv
创造性地解决此问题。
其他(部分)解决方案可以通过 rsync 实现:
rsync -a --filter="-! */" sorce_dir/ target_dir/
这里的技巧是--filter=RULE
排除 ( -
) 不是 ( !
) 目录 ( ) 的*/
所有内容的选项
在 ubuntu 上,您可以尝试:
cp -r --attributes-only <source_dir> <target_dir>
它不会复制文件数据。从手册页cp
--attributes-only
don't copy the file data, just the attributes
注意:我不确定此选项可用于其他发行版,如果有人可以确认请更新答案。
我需要一个替代方法来仅同步文件结构:
rsync --recursive --times --delete --omit-dir-times --itemize-changes "$src_path/" "$dst_path"
这就是我意识到的方式:
# sync source to destination
while IFS= read -r -d '' src_file; do
dst_file="$dst_path${src_file/$src_path/}"
# new files
if [[ ! -e "$dst_file" ]]; then
if [[ -d "$src_file" ]]; then
mkdir -p "$dst_file"
elif [[ -f $src_file ]]; then
touch -r "$src_file" "$dst_file"
else
echo "Error: $src_file is not a dir or file"
fi
echo -n "+ "
ls -ld "$src_file"
# modification time changed (files only)
elif [[ -f $dst_file ]] && [[ $(date -r "$src_file") != $(date -r "$dst_file") ]]; then
touch -r "$src_file" "$dst_file"
echo -n "+ "
ls -ld "$src_file"
fi
done < <(find "$src_path" -print0)
# delete files in destination if they disappeared in source
while IFS= read -r -d '' dst_file; do
src_file="$src_path${dst_file/$dst_path/}"
# file disappeard on source
if [[ ! -e "$src_file" ]]; then
delinfo=$(ls -ld "$dst_file")
if [[ -d "$dst_file" ]] && rmdir "$dst_file" 2>/dev/null; then
echo -n "- $delinfo"
elif [[ -f $dst_file ]] && rm "$dst_file"; then
echo -n "- $delinfo"
fi
fi
done < <(find "$dst_path" -print0)
如您所见,我使用echo
andls
来显示更改。
ls > listOfMovie.txt; 您将在 .txt 文件中获得电影列表。对于多个目录,请参见手册页。