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

Linux 如果新文件夹中已存在文件,则移动带有空格的文件并重命名,linux,bash,find,mv,Linux,Bash,Find,Mv,我需要将名为source(new file).c的文件移动到另一个目录,如果该文件已经存在,则重命名它 我试过很多东西,比如 用于$格式的文件(find~/path/-type f-name“*.c”);执行 或 IFS=$'\0'表示$中的文件(find~/path/-type f-name“*.c”);执行 Update.1对于重命名条件,我尝试if[-f/this/is/the/path/${file}];然后 或如果[-f“$file”];然后 或如果[-f“$HOME/some/pat

我需要将名为
source(new file).c
的文件移动到另一个目录,如果该文件已经存在,则重命名它

我试过很多东西,比如

用于$格式的文件(find~/path/-type f-name“*.c”);执行

IFS=$'\0'表示$中的文件(find~/path/-type f-name“*.c”);执行

Update.1对于重命名条件,我尝试
if[-f/this/is/the/path/${file}];然后
如果[-f“$file”];然后

如果[-f“$HOME/some/path/$file”];然后

我想要用户输入,比如
read-p“some messege”msg
,但我想不出来,if语句也不起作用,我不知道为什么

修复它运行脚本时,会出现拆分名称错误。例子:
mv:cannot stat'(新建):没有这样的文件或目录

有人能帮我吗

Update.2使用空格查找名称的解决方案:
find…|而IFS=read-r name;是否完成命令

更新.3如果条件不起作用的解决方案:检查正确的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
!/bin/bash
path=“/path/to/the/source”#原始目录
dest=“/path/to/the/dest”#目标目录
查找“$path”-键入f-name“*.c”-print0 |而IFS=read-r-d”文件;执行以下操作
f=${file##*/}通过删除“/”之前的所有内容来提取文件名
如果[[-f$dest/$f]];则
#如果文件已经存在
对于((;);do#然后输入一个无限循环,直到给出正确的文件名
IFS=读取-p“$f”已存在。请输入新名称:“f2
  • find…-print0
    使用空字符作为文件名分隔符 保护包含空白的文件名(空格、制表符、换行符…) 性格
  • read-d”“
    对应于
    -print0
    ,并将输入拆分为空字符
  • read
    避免与最外层管道发生冲突 由
    find
    命令提供

您是否同意重命名目录中的原始文件而不是新文件?我希望用户在那里输入,因此唯一的问题是在if条件下获取文件的全名,以便我可以修改。例如:如果文件不存在,则仅mv,如果文件存在,询问您是否要保留它(mv)或者重命名它,它可以处理所有其他文件,但不能处理空白。就是这样。将您的代码(包括#!/bin/bash(或其他))复制/粘贴到中,并修复其中发现的任何问题。99%的情况下,您需要在变量名上使用dbl引号,即,
“$file”
。祝你好运。@Sheller非常感谢,我有一些改进,但问题仍然存在于空白处。很抱歉,我没有时间对此进行测试。但是在文件名中使用parens可能会导致比使用空格更大的问题。从这个问题中学习,并使你的
.c
代码遵循使用
\ucode>的惯例e> 用字符代替空格,没有其他非阿尔芬数!祝你好运!