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

use*_*690 5 linux directory bash command-line file

我有一个名为photos以下结构的文件夹:

00001/photo.jpg
00002/photo.jpg
00003/photo.jpg
Run Code Online (Sandbox Code Playgroud)

我想要:

  1. 将文件夹(已调用photo.jpg)中的文件重命名为父文件夹.
  2. 将文件夹向上移动.
  3. 删除父文件夹.

所以photos文件夹将是这样的:

00001.jpg
00002.jpg
00003.jpg
Run Code Online (Sandbox Code Playgroud)

我怎么能在Linux的终端中做到这一点?

注意.有100000多个这样的文件夹photos.

gni*_*urf 5

自从我在评论中读到你有100000多个这样的目录以来编辑的帖子.

千万不能使用涉及bash的通配的任何方法,这将是非常缓慢和低效.而是findphotos目录中使用此命令:

find -regex '\./[0-9]+' -type d -exec mv -n -- {}/photo.jpg {}.jpg \; -empty -delete
Run Code Online (Sandbox Code Playgroud)

我使用该-n选项,mv以便我们不会覆盖现有文件.如果您的版本mv支持它,请使用它.您也可以使用该-v选项,以便mv详细了解您正在发生的事情:

find -regex '\./[0-9]+' -type d -exec mv -nv -- {}/photo.jpg {}.jpg \; -empty -delete
Run Code Online (Sandbox Code Playgroud)

阅读上一个命令:

  • -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
Run Code Online (Sandbox Code Playgroud)

请享用!