-1 によって同期されていないファイルに間違った名前を付けました。問題は、それらの 1000 個の名前を変更する必要があることです。
- 翻訳元
- 翻訳元
- 翻訳元
に
- 翻訳元
- 翻訳元
- 翻訳元
bash スクリプトまたは UNIX コマンドを使用することをお勧めします。
答え1
あなたはこれを行うことができます:
# {smallestfilenum..largestfilenum}
for i in {805754..999999}; do
mv "DBGC180_$i" "DBGC180_$(($i-1))";
done
小さな数字 (たとえば 805754..805758) で試して、期待どおりに動作するかどうかを確認してください。新しい名前のファイルがすでに存在する場合は、上書きされることに注意してください。
答え2
- 名前を変更するファイルをサブディレクトリに移動します (名前は変更しません)。
- サブディレクトリのファイルの名前を元のディレクトリに変更します。
ステップ 1 を省略することも可能ですが、それを推奨する理由は 2 つあります。
- コマンドが中断された場合、どのファイルの名前がすでに変更されているか、どのファイルの名前が変更されていないかがすぐにわかるため、中断したところから再開できます。
- 名前変更を間違った順序で実行して、既存のファイルのいずれかを上書きしてしまうことを心配する必要はありません。
テストされていないシェル スニペット (減算する数値の先頭にゼロが付かないという事実を前提としています):
mkdir to_decrement
for x in DBGC180_80575[4-9] DBGC180_8057[6-9]? DBGC180_805[8-9]?? DBGC180_80[6-9]??? DBGC180_8[1-9]???? DBGC180_9?????; do
mv "$x" to_decrement/
done
cd to_decrement
for x in *; do
number="${x##*_}"
mv -i -- "$x" "../${x%_*}_$((number-1))"
done
cd ..
rmdir to_decrement
と翻訳、これのおかげで、これをずっと簡単にすることができます数値範囲グロブ、 その内蔵mv
これにより、コマンドラインの長さ制限を回避することができ、パターンベースの大量名前変更機能. zshの場合:
autoload -U zmv
zmodload -m -F zsh/files b:zf_\*
mkdir to_decrement
zf_mv DBGC180_<805754-> to_decrement/
zmv 'to_decrement/(*)_(*)' '${1}_$(($2-1))'
rmdir to_decrement
答え3
DBGC180_805754
つまり、を にDBGC180_805753
、...55
を に、というように名前を変更したいということです...54
。これが私が対処する問題です。
まず、このスクリプトを のどこかに置きPATH
、 という名前を付けますwaltinator
。
#!/bin/bash
#step through the parameters
while [[ -n "$1" ]] ; do
oldname="$1"
# shift the arguments left
shift;
# strip off the fixed part of the old name
oldnum=${oldname##DBGC180_}
# decrement the number (this is what was wanted, right?)
newnum=$(( $oldnum - 1 ))
# build the new, improved filename
newname="DBGC180_$newnum"
if [[ -f "$newname" ]] ; then
printf "Cannot rename $oldname to $newname, $newname exists.\n" >&2
exit 1
fi
mv --no-clobber "$oldname" "$newname"
done
exit 0
次のステップでは、スクリプトが にあり$HOME/bin/waltinator
、 があると仮定しますchmod +x $HOME/bin/waltinator
。
find . -type f -name 'BDGC180_[0-9][0-9][0-9][0-9][0-9][0-9]` -print | \
sort | \
xargs $HOME/bin/waltinator
は、シェル グロブ パターン "に 6 桁の数字 ( ) が続くfind
名前のファイル (順不同) を検索します。ソートされたリストが必要なので ( の名前を変更する前に に変更すると失敗します)、 の出力を に渡します。次に、 を使用して(ソートされた) ファイル名のリストを取得し、その (ソートされた) ファイル名のリストを に渡すコマンドを作成します。引数リストを短くする必要がある場合は をお読みください。BDGC180_
[0-9]
...97
...96
...96
find
sort
xargs
$HOME/bin/waltinator
man xargs
それについては、以下をお読みください:
for page in bash mv find sort xargs ; do
man "$page"
done
答え4
各数値から 1 を引いた数値を置き換えるために使用しますrename
。
$ rename -v 's/\d{6}/sprintf("%06",($&-1))/e'
ノート
rename
Perl 式を使用してファイル名を変更します。s
rename
正規表現パターンに一致するファイル名の一部またはすべてを置き換えることを指定します。- Perl の置換式は、そのように構成されています。
s/PATTERN/REPLACEMENT/MODIFIER
\d{6}
rename
検索して置換するパターンです。これは 6 桁の 10 進数です。$
一致した部分文字列を格納する変数です\d{6}
(この場合、「部分文字列」は int です)。sprintf("%06",($&-1))
に格納されている値を取得し$
、それを減算してから、この値を置換値として返します。 は%06
先頭のゼロを処理するために存在します。e
rename
置換を Perl ステートメントであるかのように評価し、その戻り値を置換テキストとして使用するように指定されました。-v
それが何をしているかをエコーしますrename
。
より安全にしたい場合は、フラグを使用して-n
、rename
実際に実行するのではなく、何が行われるかだけを伝えます。
これは減算にのみ機能するようですから、注意して扱ってください。