3

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

文件名如下

1038282829128738912-1.jpg

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

2010038282829128738912-1.jpg

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

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

任何帮助表示赞赏。谢谢/

4

6 回答 6

7

如果你rename的 UNIX 上有这个命令,你应该可以使用类似的东西:

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

rename FROM TO FILE重命名由 指定的所有文件FILE,将第一次出现的更改FROMTO

如果这不可用,您可以使用类似的东西:

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

但是您需要记住,文件名冲突(不同目录下的相同文件名)会相互覆盖。

于 2010-08-12T12:44:39.387 回答
0

在 ZSH 中你可以这样做(可能也适用于 Bash,对此不确定):

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

也许我也可以让您对我写的工具感兴趣:http: //github.com/jkramer/virn 它允许您使用 Vim 批量重命名文件,包括所有 Vims 功能,如正则表达式等。(实际上,您可以使用任何其他 $EDITOR 也是如此)。

于 2010-08-12T12:47:24.067 回答
0

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

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

注意:未经测试。不应该删除的东西。

于 2010-08-12T12:48:03.410 回答
0

以下应该有效:

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
于 2010-08-12T13:04:27.420 回答
0
find /path -type f -name "10*jpg" | sed 's/.*/mv &/' | sed 's/mv \(.*\/\)\(.[^/]*\)/& \120\2/' | sh
于 2010-08-12T13:04:32.670 回答
-1

尚未测试,但这样的东西可以在 bash 中工作:

for i in `ls 103*.jpg`; do cp $i newdir/201003${i:3}; done
于 2010-08-12T12:46:01.230 回答