Cp

將多個文件從文件名 X 複製到文件名 Y?

  • August 25, 2018

我想要做的是在字典範圍內復製文件。

文件範例:

-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.cfgacpi.txt
  • 將3個文件複製a2ps-site.cfgadjtime.jpg
  • 將4個文件複製a2ps-site.cfgalchemist.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,從參數中提取路徑到rangeusingdirname等),但我將根據您的要求將其留給您。請在此處詢問您是否需要更多詳細資訊。

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