将包含在特定目录中的文件移动到前一个(centOS)

我会尽力解释我的问题(抱歉我的英文不好)。

我有一个像这样的目录结构的图像库:

images/dir1/subdir1/IMG/files.jpg images/dir1/subdir2/IMG/files.jpg images/dir1/subdir3/IMG/files.jpg images/dir2/subdir1/IMG/files.jpg ....... images/dir109/subdir1/IMG/files.jpg 

(dir1,dir2,… dir109),109个目录里面共有1200个子目录,每个子目录都包含一个名为IMG的目录,里面有图像(file1.jpg file2.jpg等等) ,我想将包含在名为IMG的每个目录中的所有图像移动到之前的目录(subdir)中,使其具有类似的内容:

 images/dir1/subdir1/file1.jpg images/dir1/subdir1/file2.jpg images/dir1/subdir2/file1.jpg ........ images/dir109/subdir1/file.jpg 

我使用的是Ubuntu,但是只要你使用bash就可以工作。

 #!/bin/bash for file in $(find ./images/ -name "file*.jpg"); do mv $file "$(dirname $file)/../" done 

请注意,为了简单起见,此代码不处理path中的空格,因此在其他情况下可能无法使用。

编辑:这可能是一个更好的代码。 要运行它,你必须指定'images'文件夹的绝对path或相对path。

 #!/bin/bash find "$1" -print | grep "IMG/file.*\.jpg" | while read file; do parent_dir="`dirname \"$file\"`/../" mv "$file" "$parent_dir" done find "$1" -name 'IMG' | while read IMG; do if [ -z "`ls -A \"$IMG\"`" ]; then rm -r "$IMG" fi done 

它照顾path中的空间,并删除剩余的,应该是空的IMG目录。 它只有在确实为空的情况下才会删除IMG目录。 它也应该保存多次运行这个脚本。

如果你对这一切都很陌生 – 下面是你如何使用这个代码:

  1. 复制并粘贴到一个新的文件,说moveJPGsToParent.sh。
  2. 使其可执行: chmod u+x moveJPGsToParent.sh
  3. 运行它: ./moveJPGsToParent.sh "path to images folder"

编辑2:应该承认@ Zoredache的解决scheme变得更加优雅:

rename 's/IMG\/file/file/' images/dir*/subdir*/IMG/file*.jpg