ファイルがあるディレクトリのみをコピー

ファイルがあるディレクトリのみをコピー

ファイルとそのファイルを含むディレクトリを別の場所にコピーしようとしています。次のパスを見つけることができます。

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

問題は、空のディレクトリが多く、そのディレクトリをコピーしたくなく、ファイルがあるディレクトリとファイル自体だけをコピーしたいということです。

メモ:バッシュなし、使用sh

答え1

シェル機能のみを使用する方法は次のとおりです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

次に、「ファイル」ファイルを繰り返してそのファイルからディレクトリを作成し、そこにファイルをコピーします。

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

関連情報