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

cal*_*die 3 unix bash awk renaming

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

文件名如下所示

1038282829128738912-1.jpg
Run Code Online (Sandbox Code Playgroud)

每个图像文件都以'103'开头,我想用'201003'替换文件名的这一部分 - 其余部分保持不变......例如.

2010038282829128738912-1.jpg
Run Code Online (Sandbox Code Playgroud)

图像位于一个主文件夹(图像)下的多个文件夹中 - 但将所有图像复制到一个文件夹(images_renamed)会很方便

我不知道从哪里开始 - 我用google搜索awk,但只能找到文件中重命名文本的例子.

任何帮助赞赏.谢谢/

pax*_*blo 7

如果rename在UNIX上有命令,则应该可以使用以下内容:

mkdir images_renamed
cd images_renamed
cp ../103*.jpg .
rename 103 201003 *.jpg
Run Code Online (Sandbox Code Playgroud)

rename FROM TO FILE会通过重命名指定的所有文件FILE,改变的第一次出现FROMTO.

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

mkdir images_renamed
for fspec in 103*.jpg ; do
    cp ${fspec} images_renamed/201003${fspec:3}
done
Run Code Online (Sandbox Code Playgroud)

要递归地执行此操作,我会将其放入一个脚本中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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

要展平文件层次结构,您可以使用以下内容:

#!/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
Run Code Online (Sandbox Code Playgroud)

哪个输出:

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
Run Code Online (Sandbox Code Playgroud)

但你需要记住,文件名冲突(不同目录下的相同文件名)将相互覆盖.