如果文件已存在于新文件夹中,则移动带有空格的文件并重命名

Moving files with whitespaces and rename, if files already exist in the new folder

我需要将名称类似于 source (new file).c 的文件移动到另一个目录并重命名它(如果该文件已经存在)。

我尝试了很多东西,比如

for file in $(find ~/path/ -type f -name "*.c"); do

IFS=$'[=12=]' for file in $(find ~/path/ -type f -name "*.c"); do

Update.1 对于重命名条件,我尝试 if [ -f /this/is/the/path/${file} ]; thenif [ -f "$file" ]; then

if [ -f "$HOME/some/path/$file" ]; then

我想要像 read -p "some messege" msg 这样的用户输入,但我无法理解,if 语句也不起作用,我不知道为什么...

修复它 当我 运行 脚本时,出现拆分名称错误。例子: mv: cannot stat '(new': No such file or directory

有人可以帮我解决这个问题吗?

Update.2 查找带有空格的名称的解决方案:find ... | while IFS= read -r name; do your command done

Update.3 if 条件如何不起作用的解决方案:检查正确的 awnser

我的遗憾

请您尝试以下操作:

#!/bin/bash

path="/path/to/the/source"      # original directory
dest="/path/to/the/dest"        # destination directory

find "$path" -type f -name "*.c" -print0 | while IFS= read -r -d "" file; do
    f=${file##*/}       # extracts filename by removing everything before "/"
    if [[ -f $dest/$f ]]; then
                        # if the file already exists
        for ((;;)); do  # then enter a infinite loop until proper filename is given
            IFS= read -p "'$f' already exists. Input new name: " f2 < /dev/tty
            if [[ ! $f2 =~ [[:alnum:]_] ]]; then
                echo "'$f2' is not a valid filename."
            elif [[ ! -f $dest/$f2 ]]; then
                        # a proper filename is input
                break
            else        # the filename still exists
                f=$f2
            fi
        done
    fi
    mv -- "$file" "$dest/$f2"
done
  • find ... -print0 使用空字符作为文件名分隔符 保护包含空白的文件名(空格,制表符,换行符......) 字符.
  • read -d "" 对应 -print0 并在空字符上拆分输入。
  • read < /dev/tty避免与最外层管道冲突 由 find 命令提供。