gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:22:27 25 4
gpt4 key购买 nike

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

文件名如下

1038282829128738912-1.jpg

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

2010038282829128738912-1.jpg

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

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

感谢任何帮助。谢谢/

最佳答案

如果您的 UNIX 上有 rename 命令,您应该可以使用类似这样的命令:

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

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

关于bash - 使用 UNIX 批量重命名文件 - 我应该使用 awk 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3467689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com