使用 shell 脚本在 Unix 服务器中重命名具有相同文件名模式的文件
Renaming files with same file name pattern in Unix server using shell script
我在 Unix 服务器中有几个具有相同文件名模式的文件。
示例:
示例:
ABC DE FGH IJKL 04012022.csv
ABC DE FGH IJKL 04022022.csv
预期输出:
ABC_DE_FGH_IJKL_04012022.csv
ABC_DE_FGH_IJKL_04022022.csv
这是我试过的。但是在 mv 命令中出现错误,因为它试图同时重命名这两个文件。
for file in ls ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(ls ABC\ DE\ FGH\ IJKL\ ????????.csv | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_"$date_part.csv
#Renaming file using mv command
mv ABC\ DE\ FGH\ IJKL\ ????????.csv $csv_file_nm
done
显示的代码严重损坏:
for file in ls ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(ls ABC\ DE\ FGH\ IJKL\ ????????.csv | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_"$date_part.csv
#Renaming file using mv command
mv ABC\ DE\ FGH\ IJKL\ ????????.csv $csv_file_nm
done
要使用这个想法(这不是一个很好的方法,但是......),你需要在循环中使用 "$file"
而不是重复 ls
操作:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(echo "$file" | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_$date_part.csv"
#Renaming file using mv command
mv "$file" "$csv_file_nm"
done
该脚本使用通配符而不是 ls
来生成文件名 — 我从 for
行中删除了一个杂散的 ls
。您可能打算为 file in $(ls …)
或 file in `ls …`
写作——但这不是问题所在。也不推荐处理 ls
的输出。
不过,既然要用下划线代替空格,更直接的操作方式是:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
csv_file_nm=$(echo "$file" | sed 's/ /_/g')
mv "$file" "$csv_file_nm"
done
或者,如果您的 shell 是 Bash(并且足够新),那么:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
mv "$file" "${file// /_}"
done
或者,如果您在系统上有 Perl-based rename
(有时称为 prename
)命令,则:
rename 's/ /_/g' "ABC DE FGH IJKL "????????.csv
我在 Unix 服务器中有几个具有相同文件名模式的文件。
示例: 示例:
ABC DE FGH IJKL 04012022.csv
ABC DE FGH IJKL 04022022.csv
预期输出:
ABC_DE_FGH_IJKL_04012022.csv
ABC_DE_FGH_IJKL_04022022.csv
这是我试过的。但是在 mv 命令中出现错误,因为它试图同时重命名这两个文件。
for file in ls ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(ls ABC\ DE\ FGH\ IJKL\ ????????.csv | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_"$date_part.csv
#Renaming file using mv command
mv ABC\ DE\ FGH\ IJKL\ ????????.csv $csv_file_nm
done
显示的代码严重损坏:
for file in ls ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(ls ABC\ DE\ FGH\ IJKL\ ????????.csv | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_"$date_part.csv
#Renaming file using mv command
mv ABC\ DE\ FGH\ IJKL\ ????????.csv $csv_file_nm
done
要使用这个想法(这不是一个很好的方法,但是......),你需要在循环中使用 "$file"
而不是重复 ls
操作:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(echo "$file" | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_$date_part.csv"
#Renaming file using mv command
mv "$file" "$csv_file_nm"
done
该脚本使用通配符而不是 ls
来生成文件名 — 我从 for
行中删除了一个杂散的 ls
。您可能打算为 file in $(ls …)
或 file in `ls …`
写作——但这不是问题所在。也不推荐处理 ls
的输出。
不过,既然要用下划线代替空格,更直接的操作方式是:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
csv_file_nm=$(echo "$file" | sed 's/ /_/g')
mv "$file" "$csv_file_nm"
done
或者,如果您的 shell 是 Bash(并且足够新),那么:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
mv "$file" "${file// /_}"
done
或者,如果您在系统上有 Perl-based rename
(有时称为 prename
)命令,则:
rename 's/ /_/g' "ABC DE FGH IJKL "????????.csv