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

使用UNIX批量重命名文件-我应该使用awk吗?

  •  2
  • calumbrodie  · 技术社区  · 15 年前

    我有大量的图像文件,我需要从命令行重命名。我相信最好的方法是使用awk(如果不正确,请更正)。

    1038282829128738912-1.jpg
    

    每个图像文件都以“103”开头,我想用“201003”替换文件名的这一部分-保留其余部分不变。。。如。

    2010038282829128738912-1.jpg
    

    图像位于一个主文件夹(images)下的多个文件夹中,但将所有图像复制到一个文件夹(images\u重命名)会很方便

    我不知道从哪里开始-我已经搜索了awk的用法,但只能找到重命名文本的例子 里面

    谢谢你的帮助。谢谢/

    6 回复  |  直到 15 年前
        1
  •  7
  •   paxdiablo    15 年前

    如果你有 rename 在UNIX上,您应该能够使用以下命令:

    mkdir images_renamed
    cd images_renamed
    cp ../103*.jpg .
    rename 103 201003 *.jpg
    

    rename FROM TO FILE 将重命名指定的所有文件 FILE FROM TO .

    如果不可用,您可以使用以下内容:

    mkdir images_renamed
    for fspec in 103*.jpg ; do
        cp ${fspec} images_renamed/201003${fspec:3}
    done
    

    find

    #!/usr/bin/bash
    
    rm -rf images_renamed
    ls -lR images
    echo
    
    cd images
    find . -name '*.jpg' | while read -r; do
        mkdir -p "../images_renamed/$(dirname "$REPLY")"
        echo 'Copying from' [$REPLY]
        echo '          to' [../images_renamed/$REPLY] and renaming.
        echo
        cp "$REPLY" "../images_renamed/$REPLY"
        cd "$(dirname "../images_renamed/$REPLY")"
        rename 103 201003 "$(basename "$REPLY")"
        cd - >/dev/null
    done
    
    cd ..
    ls -lR images_renamed
    

    只需要中间的一部分,其余的用于测试。下面的输出显示了它的工作原理,将每个文件复制到新的目录结构,并重命名相关文件。

    images:
    total 0
    drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir1
    drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir2
    drwxr-xr-x+ 1 pax None 0 2010-08-12 20:56 dir3
    
    images/dir1:
    total 0
    -rw-r--r-- 1 pax None 0 2010-08-12 20:55 102xxx.jpg
    -rw-r--r-- 1 pax None 0 2010-08-12 20:55 103xxx.jpg
    
    images/dir2:
    total 0
    -rw-r--r-- 1 pax None 0 2010-08-12 20:55 103yyy.jpg
    
    images/dir3:
    total 0
    drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir 4
    
    images/dir3/dir 4:
    total 0
    -rw-r--r-- 1 pax None 0 2010-08-12 20:55 103zzz.jpg
    
    Copying from [./dir1/102xxx.jpg]
              to [../images_renamed/./dir1/102xxx.jpg] and renaming.
    
    Copying from [./dir1/103xxx.jpg]
              to [../images_renamed/./dir1/103xxx.jpg] and renaming.
    
    Copying from [./dir2/103yyy.jpg]
              to [../images_renamed/./dir2/103yyy.jpg] and renaming.
    
    Copying from [./dir3/dir 4/103zzz.jpg]
              to [../images_renamed/./dir3/dir 4/103zzz.jpg] and renaming.
    
    images_renamed:
    total 0
    drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir1
    drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir2
    drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir3
    
    images_renamed/dir1:
    total 0
    -rw-r--r-- 1 pax None 0 2010-08-12 21:19 102xxx.jpg
    -rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003xxx.jpg
    
    images_renamed/dir2:
    total 0
    -rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003yyy.jpg
    
    images_renamed/dir3:
    total 0
    drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir 4
    
    images_renamed/dir3/dir 4:
    total 0
    -rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003zzz.jpg
    

    #!/usr/bin/bash
    
    rm -rf images_renamed
    ls -lR images
    echo
    
    cd images
    mkdir -p ../images_renamed
    find . -name '*.jpg' | while read -r; do
        newfile="$(basename "$REPLY")"
        echo 'Copying from' [$REPLY]
        echo '          to' [../images_renamed/$newfile] and renaming.
        echo
        cp "$REPLY" "../images_renamed/$newfile"
        cd ../images_renamed
        rename 103 201003 "$newfile"
        cd - >/dev/null
    done
    

    输出:

    cd ..
    ls -lR images_renamed
    images:
    total 0
    drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir1
    drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir2
    drwxr-xr-x+ 1 allan None 0 2010-08-12 20:56 dir3
    
    images/dir1:
    total 0
    -rw-r--r-- 1 allan None 0 2010-08-12 20:55 102xxx.jpg
    -rw-r--r-- 1 allan None 0 2010-08-12 20:55 103xxx.jpg
    
    images/dir2:
    total 0
    -rw-r--r-- 1 allan None 0 2010-08-12 20:55 103yyy.jpg
    
    images/dir3:
    total 0
    drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir 4
    
    images/dir3/dir 4:
    total 0
    -rw-r--r-- 1 allan None 0 2010-08-12 20:55 103zzz.jpg
    
    Copying from [./dir1/102xxx.jpg]
              to [../images_renamed/102xxx.jpg] and renaming.
    
    Copying from [./dir1/103xxx.jpg]
              to [../images_renamed/103xxx.jpg] and renaming.
    
    Copying from [./dir2/103yyy.jpg]
              to [../images_renamed/103yyy.jpg] and renaming.
    
    Copying from [./dir3/dir 4/103zzz.jpg]
              to [../images_renamed/103zzz.jpg] and renaming.
    
    images_renamed:
    total 0
    -rw-r--r-- 1 allan None 0 2010-08-12 22:41 102xxx.jpg
    -rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003xxx.jpg
    -rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003yyy.jpg
    -rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003zzz.jpg
    

        2
  •  0
  •   jkramer    15 年前

    在ZSH中,您可以这样做(可能也在Bash中工作,对此不确定):

    for f in **/103*.jpg; mv $f some_other_directory/201003${${f:t}#103}
    

    也许我还可以让你对我写的一个工具感兴趣: http://github.com/jkramer/virn

        3
  •  0
  •   scy    15 年前

    像这样的事情可能会有帮助:

    cd images
    find . -name '*.jpg' | while read -r img; do
        mkdir -p "../images_renamed/$(dirname "$img")"
        cp -v "$img" "../images_renamed/$(echo "$img" | sed -e 's/^103/201003/')"
    done
    

    注:未测试。但不应删除内容。

        4
  •  0
  •   dogbane    15 年前

    ls -d images*
    images/          images_renamed/
    
    
    for i in `find images -type f`
    do
      cp $i images_renamed/$(basename $i | sed s/^103/201003/)
    done
    
        5
  •  0
  •   ghostdog74    15 年前
    find /path -type f -name "10*jpg" | sed 's/.*/mv &/' | sed 's/mv \(.*\/\)\(.[^/]*\)/& \120\2/' | sh
    
        6
  •  -1
  •   jartieda    13 年前

    还没有测试,但类似的东西可以在bash中工作:

    for i in `ls 103*.jpg`; do cp $i newdir/201003${i:3}; done