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
“$file”
。祝你好运。@Sheller非常感谢,我有一些改进,但问题仍然存在于空白处。很抱歉,我没有时间对此进行测试。但是在文件名中使用parens可能会导致比使用空格更大的问题。从这个问题中学习,并使你的.c
代码遵循使用\ucode>的惯例e> 用字符代替空格,没有其他非阿尔芬数!祝你好运!