find、sed、xargsを使用してMacからデータを回復するときのファイル名の変更

find、sed、xargsを使用してMacからデータを回復するときのファイル名の変更

さて、私はここで円を描きます。このコマンドを使用しています

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 {} +

ベストアンサー1

以下は常に安全で、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ブロックをまったく使用する必要はありませんが、競合状態が発生した場合はデータを保護するためにそのままにしました(上記のファイルを移動する前に別のプロセスでターゲットファイルを作成した場合)。その名前)。

最も重要なことは、ファイル名がどんなに奇妙であっても爆発しません。 改行、一重引用符文字、アスタリスク、その他のさまざまな項目が含まれている場合も同様です。

ところで、クマは考えています。いいえUnicodeでbashパラメータ拡張がどれだけうまく機能するかを決定します。

おすすめ記事