特定のファイルを含むすべてのフォルダーをコピーする方法


17

FLAC音楽フォルダーのみをバックアップしたい。FLACファイルは、フォルダー内のようにネストできます。

AlbumName/
├── Files/
│   ├── someSong01.flac
│   ├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

AlbumNameのすべてのフォルダーを、対応する構造と、少なくとも1つのFLACファイル内のどこかに含まれるコンテンツと一緒にコピーおよび移動する方法(これで十分だと思います:音楽はFLAC形式です)

編集: FLACファイルネストできます。だから私は持つことができます:

AlbumName2/
├── someSong01.flac
├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
|   └── someCover02.jpg

そして、FLACファイルだけでなく、それらのすべてのコンテンツを含むフォルダーをコピーし、別のディレクトリに貼り付けたいと思います。

だから私も持っているなら

AlbumName3/
├── someSong01.mp3
├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
|   └── someHiddenSong.flac

そして

AlbumName4/
├── Files/
│   ├── someSong01.mp3
│   ├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

別のディレクトリAlbumName、AlbumName2、AlbumName3に再帰的にcpしますが、AlbumName4ではありません。

編集: 答えのどれも本当に私が望むことをしていないので、私はそのようなものを使用することになりました:

 find -mindepth 2 -name '*.flac' -exec dirname {} \; | awk -F "/" '{print $2}' | sort -u | while read -r dirname; do cp -r "$dirname" "backup/"; done

基本的に私はすべてのflacファイルをリストし、awkを使用してルートフォルダを取得し、重複を削除して、私がやりたいことをします


どこへのバックアップ、あなたの目的地は何ですか?
ジョージウドセン

flacファイルのみをコピーする必要がありますか、少なくとも1つのflacファイルがあるフォルダー全体ですか?
誰も

@nobodyフォルダー:「少なくとも1つのFLACファイル内のどこかに含まれる構造とコンテンツを含むAlbumNameのすべてのフォルダーをコピーおよび移動するにはどうすればよいですか?
terdon

回答:


19

オプションは、fsyncファイルのみをコピーし、ディレクトリ構造を保持するrsyncを使用することです。

rsync -avzm --include=*/ --include=*.flac --exclude=* albums/ backup/
  • アーカイブ
  • v冗長
  • z転送中に圧縮します(同じコンピューターでのコピーには役に立たない場合があります)
  • m prune empty dirs
  • 最初のインクルードにはすべてのディレクトリが含まれます
  • 2番目のインクルードにはflacファイルが含まれます
  • 最後の除外は、他のすべてのファイルを除外します

本当に?彼はディレクトリ構造を保持したいと思っています。彼は次のように述べています。「すべてのAlbumNameのフォルダーを、対応する構造とコンテンツとともにコピーおよび移動するにはどうすればよいですか...」。
誰も

2
ああなるほど。私はわかりません。flacファイルのみをコピーする必要がありますか、少なくとも1つのflacファイルがあるフォルダー全体ですか?
誰も

質問が編集され、fricadelleが何を望んでいるかがより詳細に説明されました。すべてのコンテンツがコピーされることを考慮して、flacファイルがある場合、flacファイルのみをコピーするため、私の答えは間違っています。ただし、それでも他の目的に役立つ場合があります。
誰も

9

こんにちは私の友人はあなたが使用できる

mkdir newdirectory
cp -r --parents */*.flac newdirectory/

2
これまでに使用したことがない素敵な--parents
ジョージウドセン

4
これを説明してください*/*.flac!ウィルcp -r --parents AlbumName/ newdirectory/は十分ではありませんか?
ジョージウドセン

3
質問から、ネストされたディレクトリにflacがある場合とない場合があるため、globstar(shopt -s globstar)を有効に**/*.flacしてからglobに使用することをお勧めします。ダブルスターは、ゼロ個以上のディレクトリに一致します。
wjandrea

あなたは誰もが理解できるように、私は私の質問を編集してみましょう、正確に正しいwjandreaある
fricadelle

5

いい答え

もう1つ追加したいのですが、findcpioの組み合わせを使用することもできます

find . -name "*.flac" -print0|cpio --null -pdm destination/

説明:

GNU find searches the directory tree rooted at each given file name by evaluating the given expression from left to right, according to the rules of precedence (see Operators), until the outcome is known (the left-hand side is false for AND operations, true for OR), at which point find moves on to the next file name.

GNU cpio is a tool for creating and extracting archives, or copying files from one place to another. It handles a number of cpio formats as well as reading and writing tar files.

3つのcpioモードがあります。

  • コピーアウトモード: In copy-out mode, cpio copies files into an archive. It reads a list of filenames, one per line, on the standard input, and writes the archive onto the standard output.

  • コピーインモード: In copy-in mode, cpio copies files out of an archive or lists the archive contents. It reads the archive from the standard input.

  • コピーパスモード: In copy-pass mode, cpio copies files from one directory tree to another, combining the copy-out and copy-in steps without actually using an archive. It reads the list of files to copy from the standard input; the directory into which it will copy them is given as a non-option argument.

ここでは、コピーパスモードを使用しています。

  • 上記のコマンドで使用されるオプション:

見つける:

  • -name-> filenameまたはフルネームを書く代わりに正規表現を使用する

cpio:

  • '-m、--preserve-modification-time' Retain previous file modification times when creating files.
  • '-p、-pass-through' Run in copy-pass mode. see ``Copy-pass mode``.
  • '-d、-make-directories' Create leading directories where needed.'
  • --quiet' コピーされたブロックの数を印刷しないでください。

New options are the "-print0" available with GNU find, combined with the "--null" option of cpio. These two options act together to send file names between find and cpio, even if special characters are embedded in the file names.

またrsync、シェルスクリプトを使用または記述して、ディレクトリ構造を持つファイルを見つけてコピーすることもできます。

Rsyncの説明については、上記の回答をご覧ください。


2
提案するコマンドとオプションの説明を含めることで、回答を改善できます。- レビューから
J. Starnes

@dessertそうですね。完璧なご提案ありがとうございます。
bsdboy

4

回答1:find同じコマンドを使用することもできます。

mkdir newDir && find AlbumName/ -iname "*.flac" -exec cp --parents "{}" newDir/ \;

説明:

mkdir新しいディレクトリを作成します。findコマンドは*.flacAlbumNameフォルダーにあるファイルを検索します。execcommandはcpfind返された各ファイル名に対してcommandを実行します。

回答2:findコマンドも同様に使用できxargsます

mkdir newDir && find AlbumName/ -iname "*.flac" | xargs -I{} cp --parents {} newDir/

詳細:findxargs


1
find | xargsスペースを含むファイル名では中断されますが、代わりに使用しfind -print0 | xargs -0ます。
デザート

1 2.flacファイル名にスペースがあるファイルを試しました。find | xargs失敗したファイル名を教えてください。
mf_starboi_8041


私は知らないが、私はスペースは使用せずに、それに含まれている長い名前のファイルをコピーすることができていますfind -print0 | xargs -0
mf_starboi_8041

試してくださいtouch "a space" && find . | xargs ls
デザート

0

私の音楽ライブラリで同じ問題を解決する必要があり、次の適合スクリプトを使用して解決しました。私は一度だけ使用するつもりなので、私はそれをすなわち変数で完全に設計しませんでした:)。

スクリプトは、rsyncを使用して、他のすべてのファイルとサブディレクトリを含むflacファイルを含むすべてのディレクトリを新しい場所に移動します。rsyncを使用すると、プロセス中にスクリプトが停止した場合にスクリプトを再開できます。

私のライブラリ構造:

library
|-artist
  |- album 1 (mp3)
  |- album 2 (flac)

新しいライブラリ構造:

library
|-artist
  |- album 1 (mp3)

library-lossless
|-artist
  |- album 2 (flac)

(1)SOURCE宛先で次のシェルスクリプトを起動します(TARGETを選択したそれぞれのディレクトリに置き換えます-絶対パスを使用しました)

1行目:FLACファイルやパイプを含むすべてのディレクトリを見つける(|)は、そのソートに
行2:ソートとパイプと削除重複それにリストループ行う
行3:各ディレクトリのために行う
プロセス内のディレクトリを示しています。行4
行5:ターゲットディレクトリへのrsync +ソースを削除し、ターゲットロケーション
行6の構造(-R)を保持:空のディレクトリを削除(rsyncはファイルのみを削除するため)

find . -type f -name \*.flac -printf "%h\n" | 
sort -u | 
while read -r dirname; do
    echo $dirname
    rsync -azvm -R --remove-source-files "${dirname}" TARGET
    find "${dirname}" -type d -delete
done

(2)(1)でスクリプトを正常に実行した後、ソースディレクトリで次のコマンドを実行できます。

find . -depth -type d -empty -delete

このコマンドは、スクリプト内で削除されていない空のディレクトリをすべて削除します。すなわち、すべてのサブフォルダー/アルバムにflacファイルが含まれる「アーティスト」ディレクトリー。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.