あるディレクトリから別のディレクトリにすべてのファイルをコピーして、すべてのファイル拡張子を同時に削除しようとしています。
From directory 0001:
0001/a/1.jpg
0001/b/2.txt
To directory 0002:
0002/a/1
0002/b/2
私はいくつかの発見を試みました...| xargs c...p運がない。
再帰コピーは、で簡単に実行できtar
ます。あなたの場合:
tar -C 0001 -cf - --transform 's/\(.\+\)\.[^.]\+$/\1/' . |
tar -C 0002 -xf -
tar
これを使用していない場合は、次の--transform
ことができます。
TRG=/target/some/where
SRC=/my/source/dir
cd "$SRC"
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" |\
sed 's:/\.::;s:/./:/:' |\
xargs -I% sh -c "%"
の後にスペースはありません\
。単純な行末が必要です。または、次のように 1 行に結合することもできます。
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" | sed 's:/\.::;s:/./:/:' | xargs -I% sh -c "%"
説明:
find
を検索しますprintf
により、必要なシェル コマンドが準備されます。
sed
クリーニングを行う (/some/path/./other/dir の修正など)xargs
は行全体を取りますしかし、それははるかに優れています:
より簡単に、よりクリーンに、より速く (ターゲットのサブディレクトリをチェック/作成する必要はありません)!
トリックを実行するいくつかの検索+ bash +インストールを次に示します。
for src in `find 0001 -type f` # for all files in 0001...
do
dst=${src/#0001/0002} # match and change beginning of string
dst=${dst%.*} # strip extension
install -D $src $dst # copy to dst, creating directories as necessary
done
これにより、コピーされたすべてのファイルの許可モードがrwxr-xr-x
デフォルトで変更され、インストールの--mode
オプションで変更可能になります。
私はこの醜いアヒルの子を思いつきました:
find 0001 -type d | sed 's/^0001/0002/g' | xargs mkdir
find 0001 -type f | sed 's/^0001//g' | awk -F '.' '{printf "cp -p 0001%s 0002%s\n", $0, $1}' | sh
1 行目でディレクトリ ツリーを作成し、2 行目でファイルをコピーします。これに関する問題は次のとおりです。