GNU/Linux >> Linux の 問題 >  >> Linux

サブディレクトリ内のすべてのファイルをコピーし、上書きする代わりに名前を変更する

GNU cp(1) バックアップ オプションがあります:

cp --backup SOURCE [SOURCE...] [DESTINATION]

cp(1) のマニュアルページで説明されているように、他のオプションで制御できる次の効果があります。 :

--backup[=CONTROL]
          make a backup of each existing destination file

-b     like --backup but does not accept an argument

-S, --suffix=SUFFIX
          override the usual backup suffix

バックアップサフィックスは ~ です 、--suffix で設定されていない限り またはSIMPLE_BACKUP_SUFFIX .バージョン管理方法は --backup で選択できます オプションまたは VERSION_CONTROL を介して 環境変数。値は次のとおりです:

  • noneoff :バックアップを作成しない (たとえ --backup であっても) 与えられます)
  • numberedt :番号付きバックアップを作成
  • existingnil :番号付きバックアップが存在する場合は番号付き、そうでない場合はシンプル
  • simplenever :常に簡単なバックアップを作成

cp --backup=existing --suffix=.orig ~/Music/* ~/Videos

これにより、~/Music のすべてのファイルがコピーされます ~/Videos へ .移動先に同名のファイルが存在する場合は .orig を追加してリネーム バックアップとしてその名前に。バックアップと同じ名前のファイルが存在する場合、代わりに .1 を追加してバックアップの名前を変更します そして、それも存在する場合は .2 など。その後、ソース ファイルが宛先にコピーされます。

サブディレクトリ内のファイルを再帰的にコピーする場合は、-R を使用します :

cp -R --backup=existing --suffix=.orig ~/Music ~/Videos

あなたの問題は、実際に cp を見つけることです ターゲット ファイルが既に存在する場合、別の名前でターゲット ファイルを作成するバリアント。そのためのツールは知りませんが、自分で実装するのは難しくありません:

cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"

このスクリプトは cp を呼び出します 失敗した場合に備えて、チェックサムをファイル名に追加します。欠点:同じ名前の 3 番目のファイルが表示されると、2 番目のファイルが同一であれば上書きされます .

上記のスクリプトが saveCopy と呼ばれるとします。 親作業ディレクトリに保存すると、次のように動作します:

$ find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;
./a/z1.jpg -> /tmp/Extracted/z1.jpg
./a/z2.jpg -> /tmp/Extracted/z2.jpg
./a/z3.jpg -> /tmp/Extracted/z3.jpg
/tmp/Extracted/z3.jpg not overwritten
./b/z3.jpg -> /tmp/Extracted//z3.jpg~d41d8cd98f00b204e9800998ecf8427e
./b/z4.jpg -> /tmp/Extracted/z4.jpg

スクリプトは単一の入力ファイルに対してのみ機能し、ターゲットがディレクトリの場合にのみ機能することに注意してください!確かに改善できます;-)


Linux
  1. 特定のディレクトリ内のファイルとサブディレクトリの数をカウントする方法

  2. Linuxですべてのファイルとディレクトリ名を小文字に変更

  3. 名前を変更せずにファイルマネージャでファイルとフォルダを非表示にする方法

  1. を除くすべてのファイルを一覧表示するコマンド。 (ドット) と .. (ドット ドット)

  2. linux-shell:ファイル名を作成時の名前に変更

  3. すべてのサブディレクトリで一致するファイルを削除します

  1. ディレクトリとサブディレクトリ内のファイル数を見つける方法

  2. Linux ですべてのフォルダーとファイルの名前を小文字に変更するにはどうすればよいですか?

  3. ディレクトリ(およびそのサブディレクトリ)内のすべてのpdfファイルを単一の出力ディレクトリに再帰的にコピーするにはどうすればよいですか?