親ディレクトリ(/home/anik/"All My Directories")に、次の命名構造を持つ100のディレクトリがあります。
- Zt.isolate1.Spade
- Zt.isolate2.Spades
- Zt.isolate100.Spades
「Zt」を削除したい。そして各ディレクトリ名の「.Spades」部分。
ループ内のすべてのディレクトリに対してこれを行う方法を教えてください。ありがとうございます。
答え1
名前を繰り返し、変数置換を使用して不要なビットを削除します。これは、これがファイルがある場所である$HOME
と仮定します(ファイルが別の場所にある場合は別の値に変更)。/home/anik
topdir
#!/bin/sh
topdir=$HOME
for dirpath in "$topdir"/Zt.*.Spades; do
[ ! -d "$dirpath" ] && continue
newdirpath=$topdir/${dirpath#$topdir/Zt.}
newdirpath=${newdirpath%.Spades}
if [ -e "$newdirpath" ]; then
printf 'Can not rename "%s" into "%s", name taken\n' "$dirpath" "$newdirpath"
else
printf 'Renaming "%s" into "%s"\n' "$dirpath" "$newdirpath"
echo mv "$dirpath" "$newdirpath"
fi
done
この式は、最初にディレクトリファイル名を持たない$topdir/${dirpath#$topdir/Zt.}
ディレクトリのパス名に置き換えられます。Zt.
プレフィックスを削除し$topdir/Zt.
、$topdir/
最初に再度追加してこれを行います。
式は値の末尾で文字列を拡張しますが、${newdirpath%.Spades}
削除します。$newdirpath
.Spades
echo
mv
命令を実行する代わりに、実行する命令を出力するために命令の前に追加しました。コードをテストしecho
、正しいと思われる場合は削除してください。
答え2
Perlツールを使用できますrename
。
rename -n 's/Zt\.(.+?)\.Spades$/$1/' /home/anik/Zt.*.Spades
(-n
出力が満足であれば削除して実際に名前を変更してください)
確認するこれ正しいrename
ツールを選択してください。