複数のディレクトリ名の最後の部分を削除する方法は?

複数のディレクトリ名の最後の部分を削除する方法は?

「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_v1B20150512_101129_3016_v1A20150512_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

おすすめ記事