我对 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
.