如何防止“mv”將一組文件移動到一個正常文件中?
由於我犯了一個愚蠢的錯誤,我剛剛失去了我的音頻收藏的一小部分。:-(
很高興我有一個相當新的備份,但它仍然很煩人。除了你的真實情況,另一個惡作劇的罪魁禍首是
mv
,它將顯示如下:音頻文件有一定的方案:
ARTIST - Some Title YY.mp3
其中
YY
是 2 位數年份規範。mkdir 90<invisible control character>
(到現在為止,我還不知道我實際上輸入了三分之一的多餘字元,這是不可見的……!)
我不想將所有內容都放在一個目錄中,而是希望將所有 1990 年代的音樂都放在一個目錄中。所以我輸入:
find . -name '* 9?.mp3' -exec mv {} 90 \;
不難理解發生了什麼,嗯?:->
(災難性的)結果是一個名為“90 something ”的原始空目錄(其中一些是“不可見的”控製字元)和一個名為“90”的單個文件,被覆蓋了n次。
所有文件都不見了。:-(( (明顯地)
Wish
mv
會及時檢查目標“文件”的簽名(請記住 NIX:Everything Is A Filed------
)是否以(例如)開頭drwxr-xr-x
。而且,當然,目的地是否存在。上述情況有一個變體,當您只是先忘記*mkdir
目錄時。(但當然,你假設它在那裡……)甚至我們以大寫字母W開頭的討厭的作業系統也這樣做。如果您要求,甚至會提示您指定目標的類型(文件?目錄?)。
因此,我想知道我們 *NIXers 是否仍然必須為自己編寫一個“
mv
scriptlet”來避免這些最不希望出現的意外。
/
如果要將文件移動到目錄,可以將 a 附加到目標位置。如果目錄不存在,您將收到錯誤消息:mv somefile somedir/ mv: cannot move ‘somefile’ to ‘somedir/’: Not a directory
如果目錄存在,它會將文件移動到該目錄中。
GNU coreutils
mv
已經有一個選項指定您要移動到一個目錄:-t
/--target-directory
。如果該選項的參數不存在,mv
則會抱怨而不是將所有文件移動到相同的文件名。我會這樣寫你的搬運工:
find . -name '* 9?.mp3' -exec mv -t 90 {} +
請注意使用
+
代替\;
,將盡可能多的文件名放在一起,從而加快執行速度。