继续重命名,直到文件不存在于目录中

时间:2013-11-26 11:00:36

标签: bash file

我需要检查目录中是否存在文件,如果它通过向original.txt添加额外的original.txt.txt扩展程序来重命名该文件。但请检查重命名的文件是否仍然存在。

我的代码只更改了一次,并且在重命名之前没有检查其余内容。它只会覆盖我的所有original.txt.txt

问题:

如何根据需要多次检查所有文件并添加.txt,以免与目录中的任何其他名称冲突。

if [ -e "$destination_folder/$basename_file" ]
     then
     cp "$file_name" "$destination_folder/$basename_file".txt
     fi

1 个答案:

答案 0 :(得分:0)

如果我理解正确,只有在没有新名称的其他文件时才想重命名文件。这是为了防止意外覆盖这个其他文件。

要实现这一点,您可以使用mv(我假设您用于重命名)使用选项-i,以便在覆盖任何内容之前询问。如果您确定不想重命名任何内容,可以将yes n传递给mv命令:

yes n | mv -i "$old" "$new"

为了防止看到丑陋的自动回答问题,您可以将命令的stderr重定向到/dev/null

(yes n | mv -i "$old" "$new") 2> /dev/null

现在只有在新名称空闲时才会重命名该文件。否则它什么都不做。

编辑:

您可以使用循环查找“免费”名称:

name=$original
while [ -e "$name" ]
do
  name="$name.txt"
done
mv "$original" "$name"

通过这种方式,您将找到一个免费名称,然后使用它。

请注意,这仍然会覆盖刚刚创建的新名称文件。 Unix系统是多任务处理,另一个进程可以在循环之后创建一个新名称的文件,在<{em> mv命令之前创建

为了避免这种病态情况(如果你不能确定不会发生这种情况),你应该使用我的上述方法只有在没有任何东西被覆盖的情况下才能移动,然后你应该检查原始文件(用原始文件名)仍然存在,如果它仍然存在,再试一遍:

new=$old.txt
while true
do
  (yes n | mv -i "$old" "$new") 2> /dev/null
  if [ -e "$old" ]
  then
    new=$new.txt
  else
    break
  fi
done