![仅复制带有文件的目录](https://linux22.com/image/68731/%E4%BB%85%E5%A4%8D%E5%88%B6%E5%B8%A6%E6%9C%89%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%AE%E5%BD%95.png)
我正在尝试将文件及其所在目录复制到另一个位置。我可以找到这样的路径:
find ~/dim_import/* -type f ! -name xdir | cut -d '/' -f 5-10
哪个输出
general/header.txt
scripts/test
scripts/tt
如何将它们复制到另一个位置?例如,新位置是
new/general/header.txt
new/scripts/test
new/scripts/tt
问题是有更多的空目录,我不想复制这些目录,只想复制其中包含文件的目录和文件本身。
笔记:不使用 bash, 使用sh
。
答案1
这是一个仅使用 shell 功能的方法POSIX
:
find ~/dim_import/* -type f ! -name xdir -exec sh -c '
p=${1%/*};
d=${p##*/};
f=${1##*/};
mkdir -p new/"$d";
cp "$1" new/"$d"' -- {} \;
答案2
xargs 应该可用。你可以使用:
find ~/dim_import/* -type f ! -name xdir | xargs -I {} cp {} new/{}
答案3
既然您已经知道如何过滤文件,那么就使用递归复制:cp -R
或者你可以只使用rsync
with--prune-empty-dirs
选项。
rsync --exclude='*xdir*' --prune-empty-dirs ~/dim_import ~/new
注意:如果您不使用源中的尾部斜杠(如上面的示例),dim_import
也会被复制。
答案4
我最终只是写入一个文件:
find ~/dim_import/* -type f ! -name xdir | cut -d '/' -f 5-6 > files
然后循环遍历“files”文件并从中创建目录,然后将文件复制到那里。
while read line; do
fileDir=`echo "$line" | cut -d '/' -f 1` # get folder name
fileName=`echo "$line" | cut -d '/' -f 2` # get file name
cd ~/"sr${srNum}" # go to SR folder
# If proper directory doesn't exist, create
if [ ! -d "$fileDir" ]; then
mkdir "$fileDir"
fi
# Copy file to respected directory
cd $ROOT # go back to dim_import
cp "$fileDir/$fileName" ~/"sr$srNum/$fileDir" # copy file to fileDir folder
cd ~/"sr$srNum/$fileDir" # go to fileDir
chmod u+w "$fileName" # mod the file for write access for changes
cd $ROOT # go back to dim_import
done < files