【问题标题】:Moving files to matching folders on linux command line [closed]在linux命令行上将文件移动到匹配的文件夹[关闭]
【发布时间】:2019-12-16 07:49:46
【问题描述】:

我想将文件复制或移动到匹配的文件夹中。 这些是我的文件名:

1-filename-aa.txt
2-filename-aa.txt
3-filename-aa.txt
1-filename-bb.txt
2-filename-bb.txt
3-filename-bb.txt

这些是我的文件夹名称:

aa_fa
bb_fb

我只尝试了使用“cp”命令的静态示例,但我有 40 个这样的文件夹:

cp *aa.* aa_*/
cp *bb.* bb_*/

我需要一个循环,可能需要 1 行代码来将这些文件复制或移动到匹配的文件夹。

【问题讨论】:

    标签: linux bash shell cp mv


    【解决方案1】:
    #for every file with extension
    for file in *.*
    do
        #extract catalog name
        ending=$(sed 's/.*-\(.*\)\.[^.]\+$/\1/g' <<< "$file")
        cp "$file" "${ending}_f${ending::1}"/
    done
    

    如果您的目录不遵循 _f 模式,您可以改用它:

    #for every file with extension
    
    for file in *.*
    do
        #extract catalog name
        ending=$(sed 's/.*-\(.*\)\.[^.]\+$/\1/g' <<< "$file")
        cp "$file" ${ending}_*/
    done
    

    如果 *.* 不够,还可以检查 $file 是否为目录

    [ -d "$file" ] && continue
    

    【讨论】:

    • 为了安全起见,我会在目标目录之后添加/,这样文件不仅会被重命名,而且如果目录不存在,以后可能会被破坏。
    • 感谢您的反馈。
    • 这段代码看起来不错,但我有一个问题。 “文件名”和文件扩展名部分不同。这些部分在所有文件中都是唯一的,例如“083833-aa.png”“673839393-aa.rtf”
    • 也许在 sed 命令中使用 [a-zA-Z]* 而不是 txt
    • @cnknv 我更新了答案。你也可以使用 [a-zA-Z] 而不是 [^.] 就像 joanis 提到的那样。
    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 2016-01-20
    • 2013-08-23
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多