既定のディレクトリには次のフォルダがあります。
1
2
3
4
5
10
110
したがって、各ファイルには次のものがあります。
0010011.mp3 0010031.mp3 0010051.mp3 0010071.mp3 0010021.mp3 0010041.mp3 0010061.mp3
だから最初の3文字と最後の1文字を削除して、ファイルが次のように見えるようにしたいと思います。
001.mp3 003.mp3 005.mp3 007.mp3 002.mp3 004.mp3 006.mp3
私はこれを試しました
for file in ??????*; do echo mv $file `echo $file | cut -c4-`; done
これはサブディレクトリでも機能せず、デフォルトディレクトリにあるファイルだけが機能します。
答え1
*.mp3に一致するすべてのファイルを収集してからファイル名を切り捨てることはお勧めできません。後で(たとえば、次の週)同じスクリプトを再実行したい場合があり、同じファイルの名前を変更し直すと、ファイルが短くなり、命名の競合が発生しないようにします。
サンプルファイル名は次のとおりです。001xyz1.mp3欲しいxyz.mp3
KEEP_DIR=$PWD
cd /your/music/base_dir # sub-dirs holding .mp3
RCOUNT=0 ; SKIP=0 ; FCC=0
for FFF in */001???1.mp3
do
LOC="$(dirname $FFF)"
BAS="$(basename $FFF)"
TRIM1="${BAS#1.mp3}" #could use ${BAS:4:3}
NEWF="$LOC/${TRIM1%001}.mp3"
if [ -e "$NEWF" ] ; then
echo "#-- File $NEWF already exists, not renaming $FFF"
SKIP=$((SKIP+1))
else
mv $FFF $NEWF
MCOUNT=$((MCOUNT+1))
fi
FCC=$((FCC+1))
done
echo "Renamed $MCOUNT mp3 files, of $FCC found. (Skipped $SKIP)"
cd $KEEP_DIR
#--[eof]
答え2
rename
(時々呼び出される)場合は、prename
単一のコマンドでこれを実行できます。
rename -n 's!(.*/)...(.*).(\.mp3)!$1$2$3!' */?????*.mp3
または、ファイルを繰り返すこともできます。
for f in */?????*.mp3
do
echo mv -v "$f" "$(echo "$f" | sed -r 's!(.*/)...(.*).(\.mp3)!\1\2\3!')"
done
最初のケースでは、削除-n
(またはで置き換え-v
)して操作を実行します。 2番目のインスタンスでは、echo
変更を適用できるように最初のインスタンスを削除します。
答え3
7文字の長さのデフォルト名を使用して、各mp3のsed
コマンドラインを作成できます。mv
$ find . -name "???????.mp3" | sed 's/\(.*\)\(...\)\(...\)\(.\)\(\.mp3\)/mv \1\2\3\4\5 \1\3\5/'
出力を見た後、ファイルにリダイレクトして実行できます。