根据目录名称重命名文件

根据目录名称重命名文件

如何根据文件夹名称重命名多个文件夹中的 .jpg 文件?我还希望这些.jpg文件保留在各自的文件夹中而不是移动。文件夹名称没有空格。

因此,例如,如果文件夹名称是 Red,那么我希望生成的文件名是:

Red000001.jpg
Red000002.jpg
Red000003.jpg

我有以下命令,但它给出了不良结果,将重命名的文件移到各自的文件夹之外并使文件名“草率”:

start=$PWD;
for directory in *; do
  cd "$directory";
  for filename in *; do
    mv "$filename" ../"Folder $directory - $filename";
  done;
  cd "$start";
done

答案1

如果您必须cd进出多个目录,那么使用它可以cd -将您带到最后一个当前工作目录。或者你使用pushd/ popd(在bash)。

for directory in *; do
  pushd "$directory"
  index=1
  for filename in *; do
    extension="${filename##*.}"
    if [ "$filename" != "$extension" ]; then
      extension=".$extension"
    else
      # i.e. there is no dot in the file name
      extension=""
    fi
    target_filename="${directory}$(printf "%06d" "$index")${extension}"
    if [ -f "$target_filename" ]; then
      echo "File ${target_filename} exists; aborting."
      exit 3
    fi
    mv "$filename" "${target_filename}"
    ((index++))
  done
  popd
done

此代码不能很好地处理名称冲突(如果已经有一个文件Red00004)。它只是检查并中止。

相关内容