コマンドラインのファイルを特定の文字列に置き換える

コマンドラインのファイルを特定の文字列に置き換える

(ディスク全体で)あるファイルを別のファイル(両方とも同じパスにある)で検索し(一致する場合)、置き換える必要があります。

例:

  Folder 1
    x*.txt (good) (e.g.: xFile.txt)
    *.txt (bad) (e.g.: File.txt)

同じパスにある 2 つのファイルが一致する場合は、 : を削除し、*.txt (e.g.: File.txt): の名前を次のようx*.txt (e.g.: xFile.txt)に変更する必要があります。*.txt (e.g.: File.txt)

結果:

 Folder 1
  *.txt (e.g: File.txt... old xFile.txt)

私は次のコマンドを使用します。

find -name 'x*.txt' | sed -r 'p;s/g([^\/]*.txt)/\1/' | xargs -d '\n' -n2 mv

問題は、コマンドを実行する前に、コマンドが両方のファイルが存在する(xFile.txtとFile.txtが同じパスにある)ことを確認しないことです。

どうすれば解決できますか?事前にありがとう

答え1

GNUツールを使用すると、次のことができます。

(export LC_ALL=C
  find . -name '*.txt' -print0 |
  sed -Ez 's|/x([^/]*)$|/\1|' |
  sort -z |
  uniq -zd |
  sed -z 'h;s|.*/|&x|;G' |
  xargs -r0n2 echo mv)

複数の名前で始まるファイルがないとしますx。たとえば、そうではありません。mv ./xx.txt ./x.txt

答え2

まず、タスクを実行する関数を定義します。

switcheroo() {
    [[ -f x"$1" ]] && mv -f x"$1" "$1"
}
export -f switcheroo

今、私たちはfind捨てられた人々を繰り返すためにいくつかの暗闇の魔法を使用します。

find . -name \*.txt -execdir bash -c 'switcheroo "$0"' "{}" \;

私たちはそれを使って拡張子を持つすべてのfindファイル.txtを見つけて(必要な条件に合わせて具体化することができます)、switcherooプロセスを通してそのファイルを実行します。このプロセスを使用して代替[[ ... ]]ファイルが存在するかどうかをテストし、その場合はmv代替ファイルを実装します。 。

関連情報