入れ子になったディレクトリ内の特定のファイルをパスから派生した名前に繰り返し移動します。

入れ子になったディレクトリ内の特定のファイルをパスから派生した名前に繰り返し移動します。

他の入れ子になったディレクトリにはいくつかのファイルがあります。すべてのファイルの名前はですAnalysis.mzXML。以前に保存したディレクトリに応じて、各名前を別の名前に変更しながら、すべてのファイルを1つの場所に保持したいと思います。

ファイルを移動してディレクトリ名を指定することは、他の質問に表示されることがわかります。これこれそしてこれ

ただし、プログラムを使用して1つのディレクトリから移動し、そのディレクトリに基づいて名前のみを変更します。私の場合は、入れ子になったディレクトリのフルパスを使用してファイル名を変更したいと思いました。

すべてのファイルは次のように保存されます。

/dir1/dir2/dir3/dir4/dir5/dir6/Analytic.mzXML

それぞれがAnalysis.mzXML異なる名前を持つフォルダーに入れ子になっています。しかし、dir6偶然にはすべてのファイルの名前が同じで重要な情報を提供していないので、スキップしたいと思います。

私の期待は、いくつかのコマンドまたはスクリプトを実行すると、次の特定のパスで名前が付けられたすべてのファイルを取得できることです。

/dir1_dir2_dir3_dir4_dir5.mzXML

私はbashを使い始めましたが、この問題を解決する方法がわかりません。

答え1

書かれているように、あなたの質問は、ファイルが、、、、または同様の可能性がない、または不適切な場所に表示されても、ファイルAnalysis.mzXMLシステム全体でファイルを検索し、ファイルをルートディレクトリに移動したいことを示しています。ありそうにない/不適切。私はあなたが別のディレクトリで作業していると仮定します。/lib/perl5/5.14/Unicode/Collate/Locale/proc/sys/net/ipv4/conf/all/sys/devices/system/cpu/cpu0/cache/usr/share/doc/cmake/html/_sources

次のコマンドを実行します。

find . -mindepth 7 -maxdepth 7 -type f -name Analysis.mzXML -exec sh -c 'for arg do echo mv -i -- "$arg" "$(echo "$arg" | sed -e "s|^\./||" -e "s|/dir6/Analysis\.mzXML|.mzXML|" -e "s|/|_|g")"; done' sh {} +

-mindepth 7 -maxdepth 7Analysis.mzXMLすべてのファイルが7番目のレイヤーにあると確信している場合は、省略してください。このコマンドは、Analysis.mzXML7階層のすべてのファイルを見つけ、ミニシェルスクリプトに渡します。これは各パス名を取得し、ファイル名の./先頭とdir6末尾、一部を削除し、残りのすべての文字をに変更します。これにより、次のような出力が生成されます。Analysis/_

mv -i -- ./dir1/dir2/dir3/dir4/dir5/dir6/Analysis.mzXML dir1_dir2_dir3_dir4_dir5.mzXML
mv -i -- ./the/quick/brown/fox/jumps/dir6/Analysis.mzXML the_quick_brown_fox_jumps.mzXML
mv -i -- ./over/the/lazy/dog/foo bar/dir6/Analysis.mzXML over_the_lazy_dog_foo bar.mzXML

これが正しいと思われる場合は、コマンドを再実行しますが、最初のコマンドを削除してくださいecho(例:echo mv単に変更mv)。

メモ:

  • これは、6番目のレベルのディレクトリが実際に呼び出されることを確認しませんdir6Analysis.mzXMLでファイルを見つけたら、ファイルdir11/dir12/dir13/dir14/dir15/dir16dir11_dir12_dir13_dir14_dir15_dir16_Analysis.mzXMLdir11_dir12_dir13_dir14_dir15.mzXML
  • すでに存在する名前でファイルを移動しようとすると、確認メッセージが表示されます-imv
  • --次に始まる議論からあなたを守る必要があります。-$arg常にで始める必要があるので問題ありません./
  • 本当にファイルシステムのルートでこれを行うには、そうすることができる必要があります。cd /上記の指示に従ってください。

後で考えてみてください。というディレクトリがあると、この操作が失敗する可能性がありますAnalysis.mzXML。だからしないでください。

答え2

1つのファイルのみ移動を使用する場合は、mvソースファイル名を指定してから、ターゲットファイル名を指定してください。またはターゲットディレクトリ(たとえば、別のディレクトリで同じ名前を持つ場合)

mv /path/to/Analysis.mzXML /new/directory/new-filename.mzXML

または(新しいディレクトリに同じファイル名を保持):

mv /path/to/Analysis.mzXML /new/directory/

複数のファイルを移動するには、ターゲットを指定してください。〜しなければならないディレクトリです。例えば

 mv /path/to/*.mzXML /new/directory/

cp1つ以上のファイルをコピーする(mv

関連情報