Sed
在 Mac 上使用 find、sed 和 xargs 從數據恢復中修復文件名
好吧,我在繞圈子。我正在使用這個命令
find . -print0 -name '*.1.*' | sed -e 'p;s/\.1//' | xargs -0 -n2 mv
嘗試重命名數百個具有“.1”的文件。在有人意外刪除了價值 200GB 的數據後存檔時,在文件副檔名之前添加。
我陷入了將文件名中的空格解釋為單獨參數的 mac xargs 之間,並且無法將分隔符設置為僅換行符,而不是空格。我不知道如何找到列印 ‘\0’ 字元以及之間的換行符。關於如何讓它發揮作用的任何想法?我一直在搜尋,似乎只是在 mac 環境中使這變得比必要的複雜。
或者嘗試重命名命令但仍然有問題
find . -name '*.1.*' -type f -exec rename -n 's/\.1//' '{}' \;
根據下面的@Wildcard 回答
find . -name '*.1.*' -type f -exec sh -c ' for f do suf="${f##*.1}" new="${f%.1.*}$suf" if [ -e "$new" ]; then printf "Cannot move file <%s>\n" "$new" else mv -n "$f" "$new" fi done ' find-sh {} +
以下內容應該始終是安全的,並且應該可以在 Mac 上執行:
find . -name '*.1.*' -type f -exec sh -c ' for f do suf="${f##*.1.}" new="${f%.1.*}.$suf" if [ -e "$new" ]; then printf "Cannot move file <%s>\n" "$new" else mv -n "$f" "$new" fi done ' find-sh {} +
如果它會覆蓋現有文件,請注意成功
mv -n
退出而不重命名文件。你可能希望它被報導。所以這樣做。此外,在存在具有目標新名稱的目錄的奇怪邊緣情況下,
mv
會將文件移動到其中而無需我添加的安全檢查(即使使用-n
)。那也不可取。如果一個文件的名稱中有多個
.1.
字元串,此命令將僅刪除最後一個。(這可能比刪除第一個更接近預期。)從理論上講,您根本不需要
-n
使用安全檢查if
塊進行開關,但我將其保留以在出現競爭條件時保護數據(如果其他程序在您將文件移動到該名稱之上之前創建了目標文件) .最重要的是,無論您的文件名多麼奇怪,它都不會爆炸。 即使它們嵌入了換行符、單引號字元、星號和各種其他東西。
不過想一想,我不確定bash 參數擴展在 Unicode 上的效果如何。