我正在尝试使用 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
使用 准备脚本(假设它名为renamethem
)chmod a+x renamethem
。然后将其运行为./renamethem
.
您将看到目录列表在for
循环中被硬编码。还有其他一些方法可以更优雅地处理这个问题。您可以在命令行 ( ) 上提供列表,./renamethem Subdirectory1 Subdirectory2
在这种情况下,将一行更改为for dir in "$@"
从该命令行中选取参数。或者您可以使用数组(列表)。或者您可以用来*
匹配当前目录中的所有目录。