将文件复制到 1 或 2 个目录并重命名

将文件复制到 1 或 2 个目录并重命名

我对 Linux 还很陌生,目前正在尝试组织下载的文件。

本质上,我想.srt从子目录中获取文件,并将它们与其他文件一起移动并重命名到主目录。

我当前运行的脚本是这样的:

find "/foo/bar" -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "${1}" "${path%/*}/${path##*/}.${filename}" ' sh_cp {} \;

当结构如下时,这种方法就足够了:

├── Some.Folder.Name
    ├── Some.Video.Name.mkv
    └── Subs
        └── 2_Eng.srt

它将复制2_Eng.srt并重Some.Folder.Name命名为Some.Folder.Name.2_Eng.srt.

但是,我遇到过一些.srt双重嵌套在文件夹中的文件,例如:

├── Some.Other.Folder.Name
    ├── Some.Other.Video.Name.mkv
    ├── Some.Other.Video.Name2.mkv
    └── Subs
        ├── Video1
        │   └── 2_Eng.srt
        └── Video2
            └── 2_Eng.srt

我正在运行的脚本对它们进行了适当的重命名 ( Video1.2_Eng.srt),但它们仅被移至该Subs目录。我希望他们最终能在Some.Other.Folder.Name.

我从中获取脚本的线程详细介绍了path%/*Shell1##*/参数扩展。那么有没有办法隔离我想要文件进入的特定目录?虽然该目录名称可能会更改,但它始终是foo/bar.

我想要完成的事情可能吗?

答案1

从某种意义上说,你所要求的是不可能的。考虑:如果 find找到类似的名字

/foo/bar/Some.Other.Folder.Name/Subs/Video1/2_Eng.srt

该命令应该做什么?您“知道”要将文件移动到

/foo/bar/Some.Other.Folder.Name/Video1.2_Eng.srt

— 我的观点是,从文件名中看不出来。

您必须指定要将文件移动到的位置:

find /foo/bar -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "${1}" "/foo/bar/${path##*/}.${filename}" ' sh_cp {} \;

如果您将其放入脚本中,您将需要使起始目录可参数化。但有一个问题:该 cp命令位于具有自己的参数列表的子 shell 中。我相信这种方法是安全的:

find "$1" -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "$1" "$2/${path##*/}.${filename}" ' sh_cp {} "$1" \;

$1这会将脚本中的起始目录作为第二个参数传递到子 shell 中,因此它变为$2.

相关内容