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
.yo
dir.yo
dir
dir.yo/file.yo
dir.yo/file
dir.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
名前の変更に使用します。定期的な以下を含む他のすべての種類のファイルを除くファイル目次、先入選出、装備、シンボリックリンク、等。
mmv
zsh
これらの作業を手動で実行する代わりに、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...)
あるグローバル予選ここで、D
zmvは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