findコマンドを使用してファイル名を逆に変更しますか?

findコマンドを使用してファイル名を逆に変更しますか?

Findは素晴らしいユーティリティであり、非常に汎用性があります。既存のファイル名にサフィックスまたはプレフィックスを追加してファイル名を変更しようとしています。クール。

find -name "*" -exec mv {} {}.yo \;

今理解できない部分ですね -上記の作業をキャンセルする必要がある場合はどうすればよいですか?

編集する -
接頭辞を付けることができないことがわかりました。この問題を解決する方法はありますか?

find  -type f -name "*"  -exec mv {} yu.{} \;
mv: cannot move './o.txt.yu.yu' to 'yu../o.txt.yu.yu': No such file or directory

答え1

find . -depth -name '*.yo' -exec sh -c '
  ret=0
  for file do
    mv -i -- "$file" "${file%.yo}" || ret=$?
  done
  exit "$ret"' sh {} +

file.yoこれにより、サフィックスを追加するために使用したコマンドなどのディレクトリを含む、すべての種類のファイル名なしでに.yo変更されます。最初の名前に名前を変更してからその名前に変更すると、もはや存在しないため機能しません。file.yodir.yodirdir.yo/file.yodir.yo/filedir.yo

-depthほぼ常にバッチの名前変更を使用する方が良いので、常に使用することをお勧めします。覚えておくべき唯一のことは-prune

含めるディレクトリコンポーネントへのフルパスを使用するため、プレフィックスを使用することは機能しませんmv {} prefix{}{}、ファイル名にプレフィックスを追加するには次のようなものが必要です。

find . -depth -type f -exec sh -c '
  ret=0
  for file do
    dir=${file%/*} name=${file##*/}
    mv -i -- "$file" "$dir/yu.$name" || ret=$?
  done
  exit "$ret"' sh {} +

今回は-type f名前の変更に使用します。定期的な以下を含む他のすべての種類のファイルを除くファイル目次先入選出装備シンボリックリンク、等。

mmvzshこれらの作業を手動で実行する代わりに、Or'sなどの専用のバッチ名変更ツールを使用することをお勧めしますzmv

存在するzsh

autoload -Uz zmv
zmv '(**/)(*).yo(#qD)' '$1$2'       # remove .yo suffix
zmv '(**/)(*)(#qD.)'   '${1}yu.$2'  # add yu. prefix to regular files

(#q...)あるグローバル予選ここで、Dzmvはfindデフォルトで隠しファイルまたは隠しディレクトリのファイルも考慮するように指示し、s.と同じです。find-type f

答え2

ねじれ:

find  -name "*"  -exec mv {} {}.yo \;

簡単なアプローチは次のとおりです。

まず、「unyo.bash」スクリプトを作成します。

#!/usr/bin/env bash
for name in "$@"; do
  mv "$name"  "${name%.yo}"  
done

次にそれを使用してファイルをキャンセルします。

find  -name "*.yo"  -print0 | xargs -0 /path/to/unyo.bash

「print0」と「xargs -0」がない場合は、1つずつ実行する必要があります(毎回bashが生成されるため、非効率的です)。

find -name "*.yo" -exec /path/to/unyo.bash '{}' \;

答え3

yu../そのファイルやディレクトリはありません。

この試み

find * -type f -exec echo {} pref_{} \;

*Asteriskは、dirを除く現在のディレクトリのすべてのファイルに展開されます。
このオプションを使用するサブディレクトリがある場合は、その-pruneサブディレクトリにドリルダウンしません。

このような構造もあります。

find -type f -exec bash -c 'echo  $0 ${0%%/*}/pref_${0##*/}' {} \;

ただし、その中では、位置変数は$ 0、つまり、またはにある{$0 $1 $2 ...} +すべてのファイルからカウントダウンを開始します。{$0} \;

したがって、ファイル数は次のように計算できます。

find -type f -exec bash -c 'echo  $#' 1 {} +

このようなすべてのファイルを表示できます。

find -type f -exec bash -c 'echo  $@' 1 {} +

ここでは、スペースの代わりにスペースなしで文字や単語を使用できます。これは、$ 0変数に別の追加ファイルがあることを意味します。

答え4

今私が理解できない部分があります。上記を元に戻す必要がある場合はどうすればよいですか?

次のコマンドを使用できます。

for FILENAME in `find . -name "*.yo"`; do mv "$FILENAME" $(echo "$FILENAME" | sed -e 's/\.[^.]*$//'); done

関連情報