代码之家  ›  专栏  ›  技术社区  ›  srmark

如何将所有杂乱无章的文件复制到一个目录中?(在linux上)

  •  1
  • srmark  · 技术社区  · 17 年前

    find 命令,但一个问题是文件名重复。我不想替换文件,因为我经常有同一首歌的多个版本。自动重命名是最好的。我真的不在乎文件是如何重命名的。

    有人知道一种简单安全的方法吗?

    8 回复  |  直到 17 年前
        1
  •  6
  •   ephemient    17 年前

    你可以换一个 a/b/c.mp3 路径进入 a - b - c.mp3 复制后。以下是Bash中的一个解决方案:

    find srcdir -name '*.mp3' -printf '%P\n' |
        while read i; do
            j="${i//\// - }"
            cp -v "srcdir/$i" "dstdir/$j"
        done
    

    在没有外壳的情况下 ${//} 替代:

    find srcdir -name '*.mp3' -printf '%P\n' |
        sed -e 'p;s:/: - :g' |
        while read i; do
            read j
            cp -v "srcdir/$i" "dstdir/$j"
        done
    

    对于另一种方案,GNU cp mv -b / --backup[=CONTROL] 在手册页上。

    find srcdir -name '*.mp3' -exec cp -v --backup=numbered {} dstdir/ \;
    
        2
  •  2
  •   Glen    17 年前

    类似bash的伪代码:

    for i in `find . -name "*.mp3"`; do
        NEW_NAME = `basename $i`
        X=0
        while ! -f move_to_dir/$NEW_NAME
            NEW_NAME = $NEW_NAME + incr $X
    
        mv $i $NEW_NAME
    done
    
        3
  •  2
  •   mateusza    17 年前
    #!/bin/bash
    NEW_DIR=/tmp/new/
    
    IFS="
    "; for a in `find . -type f `
        do
        echo "$a"
        new_name="`basename $a`"
        while test -e "$NEW_DIR/$new_name"
                do
                new_name="${new_name}_"
                done
        cp "$a" "$NEW_DIR/$new_name"
        done
    
        4
  •  1
  •   Kena    17 年前

    我倾向于用一个简单的脚本来实现这一点,而不是试图放在一个命令行中。

    例如,在python中,在目录中执行遍历()相对简单,将找到的每个mp3文件复制到一个自动递增的不同目录中。

    如果你想变得更花哨,你可以有一个现有文件名的字典,只需在重复项后附加一个数字。(字典的索引是文件名,值是到目前为止找到的文件数,它将成为你的后缀)

        5
  •  1
  •   Aaron Maenpaa    17 年前
    find /path/to/mp3s -name *.mp3 -exec mv \{\} /path/to/target/dir \;
    
        6
  •  1
  •   belgariontheking    17 年前

    伪代码:

    while (-e filename)
         change filename to filename . "1";
    
        7
  •  1
  •   Agathe    17 年前

    在python中:要实际移动文件,请更改debug=False

    import os, re
    from_dir="/from/dir"
    to_dir = "/target/dir"
    re_ext = "\.mp3"
    debug = True
    
    w = os.walk(from_dir)
    n = w.next()
    while n:
        d, arg, names = n
        names = filter(lambda fn: re.match(".*(%s)$"%re_ext, fn, re.I) , names)
        n = w.next()
        for fn in names:
            from_fn     = os.path.join(d,fn)
            target_fn   = os.path.join(to_dir, fn)
            file_exists = os.path.exists(target_fn)
            if not debug:
                if not file_exists:
                    os.rename(from_fn, target_fn)
                else:
                    print "DO NOT MOVE - FILE EXISTS ", from_fn
            else:
                print "MOVE ", from_fn, " TO " , target_fn
    
        8
  •  1
  •   Greg Bender    17 年前

    由于您不关心重复文件的命名方式,请在移动时使用“备份”选项:

    find /path/to/mp3s -name *.mp3 -exec mv --backup=numbered {} /path/to/target/dir \;
    

    • 歌曲.mp3
    • 歌曲.mp3。~2~