複数の特定の親ディレクトリからファイルをコピーする

複数の特定の親ディレクトリからファイルをコピーする

複数のサブディレクトリに分割された現在のディレクトリからファイルをコピーしたいと思います。コピーするファイルには親ファイルTrueFalse親ファイルのみが必要です。Trueカタログファイルはにコピーする必要があり、dst/report/1/カタログFalseファイルはに配置する必要がありますdst/report/2/

コピープロセスを自動化する方法はまだわかりません。

  • 使えると思いましたが、find . -maxdepth digit深さが正確にどの程度かはわかりません。

  • ファイルは単に*.txtファイルでなければなりません。一部の名前が重複しても内容が異なるため、ターゲットフォルダにあるファイルの1つを使用してcp上書きする必要があります。

  • True中間の親ディレクトリがFalse存在する可能性がありますが、私が望むファイルは最後の親ディレクトリに作成されます。

  • また、ディレクトリスペースが約2個程度なので200GiB検索に時間がかかります。

  • ディレクトリとファイルのエスケープ文字がわからないので、コピープロセスを中断したくありません。

サンプルワークスペース:

```
__ current dir
  |__ path_1
        |__ True
              |__ 00000.txt
              |__ 020.txt
  |__ p_x
        |__ 100
              |__ True
                    |__ 00000.txt
                    |__ 020.txt
                    |__ 10.txt
              |__ False
                    |__ 1.txt
                    |__ 2.txt
                    |__ 200.txt
        |__ x
              |__ True
                    |__ 00000.txt
                    |__ 020.txt
              |__ False
                    |__ 1.txt
                    |__ 2.txt
        |__ True
              |__ path_2
                    |__ True
                        |__ 1.txt
  |__ x_p
        |__ ...
  |__ ...
  .
  .
  .

予想される結果:

   __ dst
      |__ report
          |__ 1
              |__ 00000.txt
              |__ 020.txt
              |__ 00000_1.txt
              |__ 020_1.txt
              |__ 10.txt
              |__ 1.txt
  
          |__ 2
              |__ 1.txt
              |__ 2.txt
              |__ 200.txt
              |__ 1_1.txt
              |__ 2_2.txt

修正する

@muruが答えたように、cpは小さいかもしれませんが、bash()で処理できる引数の数には制限がありますgetconf ARG_MAX

shopt -s globstar
cp --backup=numbered **/True/*.txt dst/report/1/
cp --backup=numbered **/False/*.txt dst/report/2/

だから当時、これらのコマンドを実行した後に-bash: /bin/cp: Argument list too long報酬を受けました。

@muruがコメントで再び言及したように、xargsこの問題は(GNU xargsとcpを想定して)解決することができます。

printf "%s\0" **/True/*.txt | xargs -0 cp --backup=numbered -t dst/report/1/

数値拡張子を持つ重複ファイルがある場合にrename便利です(例:bar.txt。〜1〜など)。

prename 's/(.txt).~(\d+)~$/-$2$1/' dst/report/*/*, 

答え1

Bashを使用して再帰的なglobを有効にして**からパターンをshopt -s globstar使用し、GNU cpがある場合にファイルを上書きするのを防ぐには、またはオプションを使用します。**/True/*.txt**/False/*.txt--backups-b

shopt -s globstar
cp --backup=numbered **/True/*.txt dst/report/1/
cp --backup=numbered **/False/*.txt dst/report/2/

番号がcp追加されます。後ろに拡張子名:

% touch foo.txt
% cp foo.txt bar.txt                   
% cp --backup=numbered foo.txt bar.txt
% ls bar.txt*
bar.txt  bar.txt.~1~
% cp --backup=numbered foo.txt bar.txt
% ls bar.txt*                         
bar.txt  bar.txt.~1~  bar.txt.~2~

関連情報