6

あるディレクトリから別のディレクトリにすべてのファイルをコピーして、すべてのファイル拡張子を同時に削除しようとしています。

From directory 0001:
 0001/a/1.jpg
 0001/b/2.txt

To directory 0002:
 0002/a/1
 0002/b/2

私はいくつかの発見を試みました...| xargs c...p運がない。

4

4 に答える 4

4

再帰コピーは、で簡単に実行できtarます。あなたの場合:

tar -C 0001 -cf - --transform 's/\(.\+\)\.[^.]\+$/\1/' . |
tar -C 0002 -xf -
于 2012-09-25T18:43:57.827 に答える
2

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 "%"

説明:

  • SRC(ソース)ディレクトリにある拡張子を持つすべてのプレーンファイルfindを検索します
  • 検索printfにより、必要なシェル コマンドが準備されます。
    • TRG (ターゲット ディレクトリ) に必要なディレクトリ ツリーを作成するコマンド
    • コピーするコマンド
  • 表面的なパスのsedクリーニングを行う (/some/path/./other/dir の修正など)
  • xargsは行全体を取ります
  • シェルで準備されたコマンドを実行します

しかし、それははるかに優れています:

  • 最初のステップで正確なコピーを作成するだけです
  • 2番目のステップでファイルの名前を変更します

より簡単に、よりクリーンに、より速く (ターゲットのサブディレクトリをチェック/作成する必要はありません)!

于 2012-09-25T20:37:14.870 に答える
1

トリックを実行するいくつかの検索+ 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オプションで変更可能になります。

于 2012-09-25T20:58:11.690 に答える
0

私はこの醜いアヒルの子を思いつきました:

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 行目でファイルをコピーします。これに関する問題は次のとおりです。

  1. ディレクトリと通常のファイルの取り扱いのみあります(シンボリックリンクなどはありません)。
  2. ファイル名にピリオド (拡張子以外) または特殊文字 (スペースなど) がある場合、2 番目のコマンドは機能しません。
于 2012-09-25T20:03:13.293 に答える