使用 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