Sed

在 Mac 上使用 find、sed 和 xargs 從數據恢復中修復文件名

  • December 5, 2017

好吧,我在繞圈子。我正在使用這個命令

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 上的效果如何。

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