Bash

遞歸地將嵌套目錄中的特定文件移動到從路徑派生的名稱

  • April 3, 2018

我在不同的嵌套目錄中有一些文件。所有文件都命名為Analysis.mzXML. 我希望將它們全部放在一個地方,同時根據之前保存的目錄將每個名稱更改為不同的名稱。

我知道移動文件並為其指定目錄名稱已在前面的其他問題中顯示,例如thisthisthis

但是,他們僅使用程序將它們移出一個目錄,並且僅根據該目錄更改名稱。就我而言,我希望使用嵌套目錄的整個路徑重命名文件

文件全部保存如下:

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

每個Analysis.mzXML都嵌套在不同名稱的文件夾中。但是,dir6恰好所有文件的名稱都相同,並且由於它沒有提供有價值的資訊,我想跳過它。

我的期望是,通過執行一些命令或腳本,我可以得到所有這些文件,並用它們的特定路徑命名,如下所示:

/dir1_dir2_dir3_dir4_dir5.mzXML

我剛剛開始使用 bash,我不確定如何解決這個問題。

如您所寫,您的問題表明您希望在整個文件系統中搜尋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 7 如果您確定所有Analysis.mzXML文件都在第七級,則可以省略。此命令查找Analysis.mzXML第七級的所有文件並將它們傳遞給一個 mini-shell 腳本。這需要每個路徑名,去掉./開頭和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為 just mv)。

筆記:

  • 這並不能驗證實際呼叫了第六級目錄dir6。如果它在 中找到一個Analysis.mzXML文件dir11/dir12/dir13/dir14/dir15/dir16,它將將該文件重命名為dir11_dir12_dir13_dir14_dir15_dir16_Analysis.mzXML 而不是dir11_dir12_dir13_dir14_dir15.mzXML.
  • 如果它試圖將文件移動到一個已經存在的名稱,-i它將導致mv要求確認。
  • --應該保護您免受以**-**. 這應該不是問題,因為$arg應該始終以./.
  • 如果您真的想從文件系統根目錄執行此操作,那應該可以。只需cd /按照上述說明進行操作即可。

事後思考:如果您有一個名為Analysis.mzXML. 所以不要那樣做。

引用自:https://unix.stackexchange.com/questions/430402