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