使用for循环重命名多个子目录中的多个文件

使用for循环重命名多个子目录中的多个文件

我正在尝试使用 for 循环重命名不同子目录中具有相同名称的文件。它们应该根据子目录的名称重命名。

Subdirectory1/File.txt
Subdirectory2/File.txt

应该看起来像

Subdirectory1/Subdirectory1.txt
Subdirectory2/Subdirectory2.txt

我尝试了很多命令,但都得到了不同的错误。我在论坛上找到的最后一个命令也不起作用。有人能帮我吗?

dir="Subdirectory1, Subdirectory2"
declare -i count=1 for file in "$dir"/*.txt; do
mv "$file" "${dir}/${dir} ${count}.txt"
count+=1
done

运行后,我得到:

mv: cannot stat ‘/*/*.txt’: No such file or directory

答案1

您可以使用这样的代码。

#!/bin/bash

# Loop across the list of directories
for dir in Subdirectory1 Subdirectory2
do
    # Only consider directories
    [ -d "$dir" ] || continue

    # Loop across any files in each directory
    for src in "$dir"/*.txt
    do
        dst="$dir/$dir.txt"
        
        # Only rename a file if it won't overwrite another one
        if [ -f "$dst" ]
        then
            # Refuse to overwrite
            echo "Target file already exists: $dst" >&2
        else
            # If the file already has the right name just skip
            [ -f "$src" ] && [ "$src" != "$dst" ] && mv -f -- "$src" "$dst"
        fi
    done
done

使用 准备脚本(假设它名为renamethemchmod a+x renamethem。然后将其运行为./renamethem.

您将看到目录列表在for循环中被硬编码。还有其他一些方法可以更优雅地处理这个问题。您可以在命令行 ( ) 上提供列表,./renamethem Subdirectory1 Subdirectory2在这种情况下,将一行更改为for dir in "$@"从该命令行中选取参数。或者您可以使用数组(列表)。或者您可以用来*匹配当前目录中的所有目录。

相关内容