Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 用空文件复制目录树_Macos_Bash - Fatal编程技术网

Macos 用空文件复制目录树

Macos 用空文件复制目录树,macos,bash,Macos,Bash,我希望创建一个文件夹树的副本,其中包含空文件。源文件夹中的文件不是空的,但我希望目标文件夹中的文件是空的。(我不认为我可以只使用软/硬链接,因为我在Mac OS X上,对吧?)它是为了跟踪许多外部硬盘的内容,这些硬盘中有大量大型视频文件 我找到了rsync-a-f“+*/”-f“-*”源/目标/来复制文件夹,但没有找到创建空文件的方法(我尝试了tcshforeach但失败,因为文件夹名称中有空格) 谢谢你的帮助 这里有一个解决方案,它甚至可以正确处理不常见的文件名(例如内部有换行符的文件名等)

我希望创建一个文件夹树的副本,其中包含空文件。源文件夹中的文件不是空的,但我希望目标文件夹中的文件是空的。(我不认为我可以只使用软/硬链接,因为我在Mac OS X上,对吧?)它是为了跟踪许多外部硬盘的内容,这些硬盘中有大量大型视频文件

我找到了
rsync-a-f“+*/”-f“-*”源/目标/
来复制文件夹,但没有找到创建空文件的方法(我尝试了tcsh
foreach
但失败,因为文件夹名称中有空格)


谢谢你的帮助

这里有一个解决方案,它甚至可以正确处理不常见的文件名(例如内部有换行符的文件名等)

它将首先创建目录树,然后创建空文件。除了
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
的文本文件?