「20150512_101129_3016」というタイトルの複数のディレクトリがあり、「20150512_101129_3016_v1A」など、下線付きの追加の文字列を含むディレクトリもあります(常にv1Aではなく、v1またはV1aなど)。最後の下線の後の最後の文字列が削除されるように、すべてのディレクトリの名前を変更したいと思います。私は、すべてのディレクトリ名が3番目のアンダースコア文字の前に同じ量のテキストを持つかどうかわからないので、最後/3番目のアンダースコアの後のすべてのテキスト(含む)を削除することができるソリューションを好みます。
答え1
単純なシェルループを使用してこれを行うことができます。
for x in ./*_*_*_*; do mv -i "$x" "${x%_*}"; done
つまり、名前に少なくとも3つのアンダースコアが含まれるすべてのファイルのファイル名を変更し、最後のアンダースコアで始まる部分を削除します。
競合がある場合(たとえば、両方20150512_101129_3016_v1A
)、20150512_101129_3016_v1B
アルファベット順に最初のファイルの名前が目的の宛先に変更され、2番目のファイルがサブディレクトリに移動されます。つまり、に20150512_101129_3016_v1B
名前を変更した後、この場合は追加の確認を追加します。20150512_101129_3016/20150512_101129_3016_v1B
20150512_101129_3016_v1A
20150512_101129_3016
for x in ./*_*_*_*; do
if [ -e "${x%_*}" ]; then
echo "Not renaming $x because ${x%_*} already exists"
continue
fi
mv "$x" "${x%_*}"
done
または、Linuxはこのチェックを実行するための-T
オプションを渡します。mv
答え2
元のディレクトリ名が同種の場合、つまりXXXXXX_XXXX_XXXX(他の_XXXXが後に続く可能性がある)形式に従うと、次のスニペットが機能します。
find ./ -maxdepth 1 -type d | while read dir; do
newdir=$(echo ${dir} | cut -d_ -f1-3)
# duplicate directory name protection
if [ -d ${newdir} ]
then
newdir=${newdir}_
echo "duplicate directory encountered. Appending _ to the new dir name"
fi
#did the dir name change ? If not, do nothing
if [ ${newdir} != ${dir} ]
then
mv ${dir} ${newdir}
fi
done
ここでは、ユーザーがこれらのサブディレクトリを含むディレクトリにあると仮定します。