
次のレイアウトを持つディレクトリがあります(その中のレイアウトはDirectory 1
他のディレクトリでも繰り返されます)。Directory <num>
親ディレクトリ ディレクトリ1 いくつかのディレクトリ その他のディレクトリ <多くのファイル> ディレクトリ2 ︙ 目次3 目次4
次のようにプレフィックスを付けてファイル名を変更し、下にあるように3つのディレクトリの上に移動してから、元の(現在空の)ディレクトリを削除したいと思います。Directory <num>
Parent directory
親ディレクトリ カタログ 1_<多くのファイル> ディレクトリ2 ︙ 目次3 目次4
どうすればいいですか?
次の内容は、以下から取得したものです。エマルジョン
find . -mindepth 2 -name '*.jpg' -exec rename -n 's!/([^/]+)$!_$1!' {} +
ファイル名を最初の親ディレクトリに変更します。
親ディレクトリ ディレクトリ1 他のディレクトリ_<多くのファイル> ディレクトリ2 ︙
答え1
まず、あなたが示したコマンドの主張された結果を再現することはできません。ファイル名を等に変更しましanother directory_file1.jpg
た
another directory_file2.jpg
。
しかし、まだ some directory
目次。
第二に、ディレクトリ構造の深さのために代わりに-mindepth 4
使用する必要があります2
。第三に、-type f
使用中に-name '*.jpg'
ディレクトリが見つかりません。しかし、6〜8週間後にはこれを見て「これを私のすべてのファイルに適用したいのです。そう言う必要はありません-name '*.jpg'
」と考えてから取り出します。その後、ディレクトリがない場合は、-type f
コマンドfind
がディレクトリを見つけて名前を変更し始めることができます。検索中にディレクトリツリーを変更することは、災害を引き起こす方法です(諺の「飛行機の作成中に飛行機を操縦する」など)。
第四に、ファイルを3つのステップに移動し、名前の前にプレフィックスを付ける名前変更コマンドは次のとおりです。Directory <num>_
名前変更 -n 's!/[^/]+/[^/]+/([^/]+)$!_$1!' (選択科目)
/[^/]+
ディレクトリレベルを表すため、コピーを2つだけ追加しました。
警告:前述したように、これを行うとファイルは3つのステップに移動します。ディレクトリツリーにこの深さより深いファイルがある場合は、最上位レベルに名前を変更せず、同様の名前に変更できますDirectory 3/some directory_file3.jpg
。
しかし、これは簡単な解決策であることがわかりました。ファイルを最上位レベルに移動その深さがいくら深くても、名前の前にプレフィックスを追加し、次を使用します。Directory <num>_
s!(\./[^/]+)/.*/([^/]+)$/$1_$2/!
長い話を短く
だから、
最後の順序は
find . -mindepth 4 -type f -exec rename -n 's!/[^/]+/[^/]+/([^/]+)$!_$1!' {} +
-name '*.jpg'
必要に応じて追加できます。-n
トレース出力に正しい操作が行われていることを示している場合は、削除してください。
これにより、ファイル名の競合が発生する可能性があります。ファイルがあれば
Directory 1/some directory/another directory/sunrise.jpg
そして
Directory 1/some directory/another directory/mountains/sunrise.jpg
コマンドはこれらの名前をすべて変更しようとしますDirectory 1_sunrise.jpg
。幸いなことに、このrename
プログラムはこの場合、何の害もないほどスマートでおなじみのようです。最初に表示されるファイルの名前が変更される可能性があり、他のファイルはそのまま残ります(通知を受け取ります)。 (-f
またはを使用して--force
既存のファイルを強制的に上書きできます。)しかし、 mv
。
最新の質問(「ファイル名にすべてのディレクトリ名を含める方法は?」):これは少し面倒です。私たちが検索していると明示的に仮定します。.
./
したがって、すべてのパス名は 。私が見つけたペレックスフのパラメータには、rename
実際には複数の文字列修正コマンドを含めることができます。したがって、すべてのファイルを最上位レベルに移動し、その名前の前にパス内のすべてのディレクトリの名前を付けることができます。
s!^\./!!;s!/!_!g
ファイル名が競合する可能性もあります。
Directory 1/abc/def_ghi/sunrise.jpg
そして
Directory 1/abc_def/ghi/sunrise.jpg
両方(おそらく)名前をDirectory 1_abc_def_ghi_sunrise.jpg
。
婦人声明:私はこれをテストしましたが、徹底的にテストしませんでした。私はこれが完璧に動作することを保証しません。上記のコマンドを試す前に、フルバックアップを作成する必要があります。