我对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%/*和1##*/是Shell参数扩展。那么,是否有一种新的方法来隔离我希望文件转到的特定目录?虽然目录名可能会更改,但它始终是foo/bar之后的下一个级别。
我想要达到的目标是可能的吗?
发布于 2022-04-02 04:06:30
从某种意义上说,你想要的是不可能的。考虑一下:如果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命令位于一个具有自己的参数列表的子subshell中。我认为这种方法是安全的:
find "$1" -type f -iname '*.srt' -exec sh -c '
path="${1%/*}"; filename="${1##*/}";
cp "$1" "$2/${path##*/}.${filename}" ' sh_cp {} "$1" \;这将启动目录(脚本中的$1 )作为第二个参数传递到子subshell,因此它成为$2。
https://unix.stackexchange.com/questions/697684
复制相似问题