首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件复制到1或2个目录中,并重命名它们

将文件复制到1或2个目录中,并重命名它们
EN

Unix & Linux用户
提问于 2022-04-02 02:31:30
回答 1查看 44关注 0票数 1

我对Linux非常陌生,目前正在尝试在下载文件时组织这些文件。

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

我正在运行的脚本是:

代码语言:javascript
复制
find "/foo/bar" -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "${1}" "${path%/*}/${path##*/}.${filename}" ' sh_cp {} \;

当结构是这样的时候,这个功能就足够好了:

代码语言:javascript
复制
├── Some.Folder.Name
    ├── Some.Video.Name.mkv
    └── Subs
        └── 2_Eng.srt

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

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

代码语言:javascript
复制
├── 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之后的下一个级别。

我想要达到的目标是可能的吗?

EN

回答 1

Unix & Linux用户

发布于 2022-04-02 04:06:30

从某种意义上说,你想要的是不可能的。考虑一下:如果find找到了一个类似于

代码语言:javascript
复制
/foo/bar/Some.Other.Folder.Name/Subs/Video1/2_Eng.srt

命令应该做什么?对要将文件移动到的“知道”进行重新排序。

代码语言:javascript
复制
/foo/bar/Some.Other.Folder.Name/Video1.2_Eng.srt

-我的观点是,从文件名上看,这一点并不明显。

您必须指定要将文件移动到何处:

代码语言:javascript
复制
find /foo/bar -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "${1}" "/foo/bar/${path##*/}.${filename}" ' sh_cp {} \;

如果要将其放入脚本中,则需要使启动目录可参数化。但是有一个问题:cp命令位于一个具有自己的参数列表的子subshell中。我认为这种方法是安全的:

代码语言:javascript
复制
find "$1" -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "$1" "$2/${path##*/}.${filename}" ' sh_cp {} "$1" \;

这将启动目录(脚本中的$1 )作为第二个参数传递到子subshell,因此它成为$2

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/697684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档