仅复制带有文件的目录

仅复制带有文件的目录

我正在尝试将文件及其所在目录复制到另一个位置。我可以找到这样的路径:

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

或者你可以只使用rsyncwith--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

相关内容