如果文件已存在于新文件夹中,则移动带有空格的文件并重命名
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} ]; then
或 if [ -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
命令提供。
我需要将名称类似于 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} ]; then
或 if [ -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
命令提供。