[英]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 個文件,除了編號之外名稱都相同,但是我要從中復制的目錄中有數百個文件。 它從002
到015
。 我只是想復制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
這給了我太多數字范圍從002
到035
的文件,這不是我需要的。
我很感激我的基本問題的任何答案,我真的很驚訝沒有與此非常相似的東西。 稍后我會擔心復制; 這些名字現在讓我發瘋。 抱歉,如果格式和行話不對,這是我的第一個問題,我對此還是很陌生。
bash
的最新版本允許像{002..015}
這樣的數字序列擴展,因此您可以執行以下操作:
cp some_dir/stuff.{002..015}.morestuff.nc some_other_dir/
當然,如果您不確定,最好先回顯:
echo some_dir/stuff.{002..015}.morestuff.nc
此外,如果stuff
和morestuff
是半不可預測的,您可以使用 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.