linux - 如何在 Linux 中基于父文件夹移动和重命名文件?

标签 linux bash file command-line directory

我有一个名为 photos 的文件夹,其结构如下:

00001/photo.jpg
00002/photo.jpg
00003/photo.jpg

我想:

  1. 将文件夹中的文件(名为 photo.jpg)重命名为父文件夹。
  2. 将其向上移动一个文件夹。
  3. 删除父文件夹。

所以 photos 文件夹应该是这样的:

00001.jpg
00002.jpg
00003.jpg

我如何在 Linux 的终端中执行此操作?

请注意。照片 中有 100000 多个这样的文件夹。

最佳答案

帖子已编辑,因为我在评论中读到您有 100000 多个这样的目录。

不要使用任何涉及 bash 通配符的方法,这会非常缓慢且效率低下。相反,从 photos 目录中使用此 find 命令:

find -regex '\./[0-9]+' -type d -exec mv -n -- {}/photo.jpg {}.jpg \; -empty -delete

我对 mv 使用了 -n 选项,这样我们就不会覆盖现有文件。如果您的 mv 版本支持它,请使用它。您还可以使用 -v 选项,这样 mv 就会变得冗长,您可以看到发生了什么:

find -regex '\./[0-9]+' -type d -exec mv -nv -- {}/photo.jpg {}.jpg \; -empty -delete

读取前面的命令为:

  • -regex '\./[0-9]+':查找当前目录中名称中只有数字的所有内容
  • -type d: 必须是目录
  • -exec mv -n -- {}/photo.jpg {}.jpg\;:将本目录下的photo.jpg文件移动到父目录下,名称为:dirname.jpg
  • -empty:如果目录现在是空的...
  • -delete: ...删除它。

在那之后,您可能想查看哪些目录没有被删除(因为例如,它包含的文件不仅仅是 photo.jpg 文件):

find -regex '\./[0-9]+' -type d

尽情享受吧!

关于linux - 如何在 Linux 中基于父文件夹移动和重命名文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387721/

相关文章:

bash - 如何使用 Curl 检索真正的重定向位置 header ?不使用 {redirect_url}

linux - bash 脚本似乎无法执行 linux 命令

java - 如何在clojure下不递归地列出路径中的文件和目录

c++ - C++中的文件命名

c -/proc 文件系统挂起我的系统

regex - 删除重复的文件扩展名

python - 在 Linux 中达到一定大小时停止 Python 脚本写入文件

在 Linux/x86-84 上传递大对象的 C++ 调用约定

bash - 显示文件和目录中每个单词出现频率的 Shell 脚本

java - 从 res 文件夹中读取 csv 文件