Shell

cp 和 mv 使用萬用字元並忘記指定目標目錄

  • December 18, 2019

我曾多次使用cpmv使用萬用字元,但我忘記指定目標目錄。以下是收集日誌時的錯誤範例:

~# mkdir problem_logs
~# cd problem_logs
~/problem_logs# cp -pv /var/log/messages*
'/var/log/messages' -> '/var/log/messages.1'

你可以看到我忘了寫.目標目錄,因為/var/log/messages*擴展為兩個文件名,第二個文件名被第一個文件名覆蓋了。

~# echo cp -pv /var/log/messages*
cp -pv /var/log/messages /var/log/messages.1

有什麼好的措施可以防止此類災難?

  • 當然不使用root帳戶是一個很好的措施(但它只會防止一些錯誤)。不幸的是,有多個(商業)基於 linux 的平台,其中許多基本操作需要root特權,並且預設情況下使用者的 UID 為 0。這些平台通常需要進行非標準修改才能使用非 root 使用者和sudo.
  • 學習使用需要確認每次覆蓋的選項**-i**( )。--interactive
  • 學習使用 GNU -n( --no-clobber) 選項來防止所有覆蓋。
  • 學習使用 GNU 語法,使用選項**-t**( --target-directory) 指定目標目錄。範例:cp -pvt. /var/log/messages*我可以看到我仍然可以忘記寫.

最後兩個選項的缺點是它們在 POSIX 中沒有標準化。它們是 GNU 擴展。

  • 還有哪些需要考慮的可能性?(包括例如替代外殼)
  • 它們的優點和缺點是什麼?(包括已經列出的可能性)

這個問題當然不是在徵求個人意見。它要求可能性及其相關的客觀屬性。

唯一的公寓$$ 1 $$答案(恕我直言)是創建一個shell函式。

就像是:

cy() { cp -i "$@"; }

使用新名稱 (cy$$ 2 $$) 將確保如果解決方案尚未安裝在某些系統中,則不會執行任何操作。而且,該解決方案可以在任何系統上執行。它甚至可以在使用它之前測試系統中是否存在某個版本的實用程序,或者只是引發錯誤/警告。

然後,可以使用您列出的所有/任何解決方案。

$$ 1 $$不對可能的解決方案或來源(GNU)做出預先判斷(或只是給出意見)。 $$ 2 $$選擇一個名稱cyco(FWIW,co是 RCS 檢出命令)或其他對您作為使用者有意義並且在將要使用它的系統中發生衝突的可能性最小的名稱。

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