複数のサブディレクトリに分割された現在のディレクトリからファイルをコピーしたいと思います。コピーするファイルには親ファイルTrue
とFalse
親ファイルのみが必要です。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~