簡體   English   中英

如何在 bash for 循環中從更大的文件列表中復制/列出具有編號名稱模式的文件?

[英]How do I copy/list files with a numbered name pattern from a much larger file list in a bash for loop?

我正在做基本的 bash for 循環,將數據從一個目錄復制到我的當前目錄。

我的文件以這種模式命名:

stuff.002.morestuff.nc

總共有 14 個文件,除了編號之外名稱都相同,但是我要從中復制的目錄中有數百個文件。 它從002015 我只是想復制002,003,004,...,014,015但事實證明它比預期的要難; 現在我只是在做 echo 以確保在將大量數據復制到我的計算機之前我得到了正確的名稱。

我嘗試過的最好的事情:

files=/path/to/dir/stuff.0*[02...15...03456789].morestuff.nc;
for f in $files; do echo $f; done

這給了我太多數字范圍從002035的文件,這不是我需要的。

我很感激我的基本問題的任何答案,我真的很驚訝沒有與此非常相似的東西。 稍后我會擔心復制; 這些名字現在讓我發瘋。 抱歉,如果格式和行話不對,這是我的第一個問題,我對此還是很陌生。

bash的最新版本允許像{002..015}這樣的數字序列擴展,因此您可以執行以下操作:

cp some_dir/stuff.{002..015}.morestuff.nc some_other_dir/

當然,如果您不確定,最好先回顯:

echo some_dir/stuff.{002..015}.morestuff.nc

此外,如果stuffmorestuff是半不可預測的,您可以使用 globs 來接受更廣泛的文件名:

echo some_dir/*.{002..015}.*.nc
cp some_dir/*.{002..015}.*.nc some_other_dir/

請注意,如果不是從 002 到 015 的每個文件都實際存在於some_dir中,您可能會收到有關文件丟失的錯誤,但 rest 確保所有確實存在的文件都將被復制,這就是目標。

我試過的最好的東西: files=/path/to/dir/stuff.0*[02...15...03456789].morestuff.nc; for f in $files; do echo $f; done files=/path/to/dir/stuff.0*[02...15...03456789].morestuff.nc; for f in $files; do echo $f; done

不要試圖在一個變量中存儲多個文件名。 給定文件名中有效的空格和其他奇怪字符,這永遠不會奏效。 參見BashFAQ #50

相反,您可以存儲在一個數組中(但這里不需要)

我正在做基本的 bash for 循環,將數據從一個目錄復制到我的當前目錄。

正如@PiMarillon 指出的那樣,您實際上並不需要此處的for循環,但如果這是您練習的一部分,則在for循環本身中使用文件 glob(通配符模式)。

使用您的列表格式,您可以最少地復制:

cp -a *[.]00[23456789][.]* *[.]01[012345][.]* newdir

(這需要在數字序列的兩端都有一個'.' ——如果[.]002[.][.]015[.]模式在目錄中不是唯一的,則根據需要添加其他唯一字符)

或者,如果從不是$PWD的目錄復制,你可以這樣做

from="../some/relative/or/abosulted/path/to"
cp -a "$from"/*[.]00[23456789][.]* "$from"/*[.]01[012345][.]* newdir

注意:文件 glob 沒有被引用,而"$from"路徑被引用。如果你引用整個路徑名擴展被抑制)

注意:對於文件 glob 的cp調用,文件名中的空格和其他奇怪的字符(如'\n'將導致問題。 處理文件名中的奇數字符的首選解決方案是將find-name-regex結合使用。

要將for循環用於相同目的,只需在for循環定義中使用相同的模式,例如

for fn in *[.]00[23456789][.]* *[.]01[012345][.]*; do 
  cp -a "$fn" newdir
done

注意:與使用單個cp相比,使用for循環的效率要低得多。在for循環中, cp將被調用 14 次而不是一次。始終避免在循環中調用實用程序 [如果可能])

綜上所述,如果使用 bash,則首選 @PiMarillon 所示的大括號擴展序列表達式 但是,帶有*[.]00[23456789][.]* *[.]01[012345][.]*cp將可移植到任何 POSIX shell。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM