Macos 用空文件复制目录树
我希望创建一个文件夹树的副本,其中包含空文件。源文件夹中的文件不是空的,但我希望目标文件夹中的文件是空的。(我不认为我可以只使用软/硬链接,因为我在Mac OS X上,对吧?)它是为了跟踪许多外部硬盘的内容,这些硬盘中有大量大型视频文件 我找到了Macos 用空文件复制目录树,macos,bash,Macos,Bash,我希望创建一个文件夹树的副本,其中包含空文件。源文件夹中的文件不是空的,但我希望目标文件夹中的文件是空的。(我不认为我可以只使用软/硬链接,因为我在Mac OS X上,对吧?)它是为了跟踪许多外部硬盘的内容,这些硬盘中有大量大型视频文件 我找到了rsync-a-f“+*/”-f“-*”源/目标/来复制文件夹,但没有找到创建空文件的方法(我尝试了tcshforeach但失败,因为文件夹名称中有空格) 谢谢你的帮助 这里有一个解决方案,它甚至可以正确处理不常见的文件名(例如内部有换行符的文件名等)
rsync-a-f“+*/”-f“-*”源/目标/
来复制文件夹,但没有找到创建空文件的方法(我尝试了tcshforeach
但失败,因为文件夹名称中有空格)
谢谢你的帮助 这里有一个解决方案,它甚至可以正确处理不常见的文件名(例如内部有换行符的文件名等) 它将首先创建目录树,然后创建空文件。除了
find
、mkdir
和touch
之外,还需要其他外部命令
#!/bin/bash
# IMPORTANT: SOURCE and DESTINATION have to be absolute pathes
# To fix the missing parameter -printf of find in mac os x,
# i used a technique to reproduce the functionality.
# But now it IS IMPORTANT that both of these variables contain an absolute path!
SOURCE="/home/you/source_dir/"
DESTINATION="/where/ever/destination_dir/"
#first 'copy' the directory tree
while
IFS="" read -r -d '' -u 9 dir
do
#remove the $SOURCE part
dir="${dir#${SOURCE}}"
mkdir "${DESTINATION}/${dir}"
done 9< <(find "${SOURCE}" -type d -print0)
#then create empty files inside the new tree
while
IFS="" read -r -d '' -u 9 file
do
#remove the $SOURCE part
file="${file#${SOURCE}}"
touch "${DESTINATION}/${file}"
done 9< <(find "${SOURCE}" -type f -print0)
#/bin/bash
#重要提示:源和目标必须是绝对路径
#要修复mac os x中缺少的find参数printf,
#我使用了一种技术来重现功能。
#但现在重要的是,这两个变量都包含一个绝对路径!
SOURCE=“/home/you/SOURCE\u dir/”
DESTINATION=“/where/ever/DESTINATION\u dir/”
#首先“复制”目录树
虽然
IFS=”“read-r-d'-u9 dir
做
#删除$SOURCE部分
dir=“${dir}#${SOURCE}”
mkdir“${DESTINATION}/${dir}”
完成9<您可以尝试在for循环中使用touch
cd /PATH/TO/SOURCE/FOLDER/
for f in *;
do touch /PATH/TO/DEST/FOLDER/$f;
done
编辑:
上面的代码将为您提供/SOURCE/FOLDER
中的所有文件和文件夹,但不是递归的。
要仅为源文件创建空文件并创建目录树(所有子文件夹),可以使用:
FILES=$(find /PATH/TO/SOURCE/FOLDER/ -type f)
for f in $FILES;
do touch /PATH/TO/DEST/FOLDER/$f;
done
我希望有帮助 基于ursusd8的答案,这里有一个递归解决方案,它将在bash版本4中工作,如果您已经安装了它的话
shopt -s globstar
cd /path/to/source/
for f in **/*; do
mkdir -p "/path/to/target/${f%/*}" # make the containing directory if required
touch "/path/to/target/$f" # make a zero-length file
done
这将比需要运行mkdir
命令的次数多得多,但速度很快。请注意,Bash4可能无法在您的系统上使用,除非您使用或之类的方法显式安装它
一个较长的替代方案是将创建目录树和触摸文件的步骤分开:
cd /path/to/source/
find . -type d -exec mkdir -p /path/to/target/{} \;
find . -type f -exec touch /path/to/target/{} \;
请注意,这个两阶段的find
解决方案不使用bashism,很可能可以在任何shell中运行。感谢您的回答。我刚刚尝试过,但我可以递归地执行此操作(为子文件夹中的所有文件创建空文件?如果您使用bash
4或更高版本,请使用shopt-s globstar;对于**/*;do
中的f,您可以尝试以下操作:文件=$(查找/PATH/TO/SOURCE/FOLDER/-type f)对于$FILES;do touch/PATH/TO/DEST/FOLDER/$f;done
中的f,这将创建一个空文件树。谢谢!但是,Mac OS中似乎不存在find-printfX@ElieV我可以重写这个脚本,这样它就可以为您工作。我只需要知道我是否可以依靠一个合适的bash
,或者您是否需要在tcsh
中完成它?谢谢再一次!在OSX上,我有bash版本3.2.57(OSX约塞米蒂股票版本)和TCSHV6.17.00(OSX约塞米蒂股票版本)@ElieV我已经编辑了脚本,因此它重新创建了-printf行为。将其保存为原样,例如tree.sh
,它应该可以与您的bash版本一起使用。小心使用绝对路径名!-因为我用来重新创建-printf
行为的方法只是从文件中删除$SOURCE
部分,并添加剩余的st打电话到$DESTINATION/
。因此,如果您在此处使用相对路径名,它将根本不起作用。您可以通过设置SOURCE=$(readlink-f../rela/path)
和DESTINATION
的相同设置来解决这个问题,这样脚本将在内部使用绝对路径名(以防您需要)。这样做的目的是什么?似乎是一个可以实现的问题,但听起来很奇怪。您真正想做的是什么?如果您想跟踪哪些文件位于哪些外部驱动器上,为什么不在每个驱动器上保留输出为find
的文本文件?