【问题标题】:In bash, how can I recursively rename each file to the name of its parent folder, retaining the original extension?在 bash 中,如何递归地将每个文件重命名为其父文件夹的名称,同时保留原始扩展名?
【发布时间】:2021-07-06 10:46:07
【问题描述】:

我有一个很大的文件夹目录,每个文件夹只有一个文件:

directory/folder1/208hasdfasdf.jpg
directory/folder2/f230fsdf.gif
directory/folder3/23fsdbfasf.jpg

I'd like to rename this to:
directory2/folder1/folder1.jpg
directory2/folder2/folder2.gif
directory3/folder3/folder3.jpg

我该怎么做?

【问题讨论】:

  • 请注意,在 Unix、BSD 和 Linux 上,它们也是“目录”,而不是 Windows 的“文件夹”概念,这不是一回事。

标签: bash freebsd


【解决方案1】:

对于显示的路径和文件名,您可以使用循环和findsed 的组合来进行替换,例如

for f in $(find directory -type f -wholename "*folder*"); do
    mv "$f" $(sed -E 's|^([^/]+)/([^/]+)/([^.]+)[.](.*)$|\1/\2/\2.\4|' <<< "$f")
done

其中sed -E 's|^([^/]+)/([^/]+)/([^.]+)[.](.*)$|\1/\2/\2.\4| 使用替代分隔符'|' 而不是'/' 以简化处理路径名,然后将"directory"^([^/]+) 分隔并捕获,然后将"folderX"([^/]+) 分隔并捕获,然后通过不带扩展名([^.]+) 的文件名,最后是扩展名(.*)$,使每个组件分别通过编号的反向引用\1\2\3\4 可用。

然后要形成新的文件名,您只需复制 \2 文件夹名来代替 \3 文件名,以获得新的文件名 \1/\2/\2.\4

使用/输出示例

$ find tmp-david -type f -wholename "*folder*"
tmp-david/folder3/23fsdbfasf.jpg
tmp-david/folder2/f230fsdf.gif
tmp-david/folder1/208hasdfasdf.jpg

将文件名替换为

$ for f in $(find tmp-david -type f -wholename "*folder*"); do 
>  mv "$f" $(sed -E 's|^([^/]+)/([^/]+)/([^.]+)[.](.*)$|\1/\2/\2.\4|' <<< "$f")
> done

导致:

$ find tmp-david -type f -wholename "*folder*"
tmp-david/folder3/folder3.jpg
tmp-david/folder2/folder2.gif
tmp-david/folder1/folder1.jpg

【讨论】:

    【解决方案2】:

    假设您使用的是bash,您可以尝试这样的事情:

    find directory/ \( -name '*.gif' -o -name '*.jpg' \) -print | 
    while read old; do
      parent=${old%/*}
      base=${parent##*/}
      ext=${old##*.}
      mv $old $parent/$base.$ext
    done
    

    如果您正在处理包含空格的文件名,您将 需要按摩一下。


    在运行此脚本之前:

    $ find directory -type f -print
    directory/folder2/f230fsdf.gif
    directory/folder1/208hasdfasdf.jpg
    directory/folder3/23fsdbfasf.jpg
    

    运行此脚本后:

    $ find directory -type f -print
    directory/folder2/folder2.gif
    directory/folder1/folder1.jpg
    directory/folder3/folder3.jpg
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2015-06-18
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多