Cp
將多個文件從文件名 X 複製到文件名 Y?
我想要做的是在字典範圍內復製文件。
文件範例:
-rw-r--r-- 1 root root 15276 Oct 5 2004 a2ps.cfg -rw-r--r-- 1 root root 2562 Oct 5 2004 a2ps-site.cfg -rw-r--r-- 4 root root 4096 Feb 2 2007 acpi.txt -rw-r--r-- 1 root root 48 Feb 8 2008 adjtime.jpg -rw-r--r-- 4 root root 4096 Feb 2 2007 alchemist.jpg
使用範例:
- 將3個文件複製
asps.cfg
到acpi.txt
- 將3個文件複製
a2ps-site.cfg
到adjtime.jpg
- 將4個文件複製
a2ps-site.cfg
到alchemist.jpg
那麼有沒有辦法將一系列文件(從文件名 X 到文件名 Y)複製到目錄中?
喜歡:
cp filenameX ... filenameY destination/
一種通用的方法是定義一個列印一系列文件名的 shell 函式。此函式的簡單版本將列出目前目錄中兩個文件名之間的所有文件:
range() { ls | sed -n "/^$1\$/,/^$2\$/p" }
這使用 sed 範圍表示列印出兩個給定字元串 (
$1
和$2
) 之間的任何內容。然後,您可以在
cp(1)
命令中使用此功能:cp $(range asps.cfg acpi.txt) /destination/path
如果您的文件名中包含空格,這將失敗。為此,您需要變得更複雜一些:
range asps.cfg acpi.txt | xargs -d '\n' -I {} cp {} /destination/path
如果您的文件名中包含換行符 (\n),這將失敗。這是非常不可能的,因此將其作為練習留給讀者。
您可以將它們一起滾動到另一個 shell 函式中:
cprange() { [ $# -eq 3 ] || { echo "usage: cprange start end dir" >&2; return 1;} range "$1" "$2" | xargs -d '\n' -I {} cp {} "$3" }
並像這樣使用它:
cprange filenameX filenameY destination
請記住,範圍僅適用於目前目錄中的文件名。您可以通過多種方式對此進行擴展(附加目錄參數到
range
,從參數中提取路徑到range
usingdirname
等),但我將根據您的要求將其留給您。請在此處詢問您是否需要更多詳細資訊。