我有一个文件在不同的文件夹,如abc.mp3 acc.mp3 bbb.mp3,我想重命名为01-abc.mp3,02-acc.mp3,03-bbb.mp3 ...我试过这个
#!/bin/bash
IFS='
'
COUNT=1
for file in ./uff/*;
do mv "$file" "${COUNT}-$file" let COUNT++ done
但是我不断收到类似语法错误的错误,有时因为找不到......有人可以提供单行解决方案,使用" find"从终端。由于某些限制,我正在寻找使用find的解决方案......提前致谢
答案 0 :(得分:2)
我可能会使用:
#!/bin/bash
cd ./uff || exit 1
COUNT=1
for file in *.mp3;
do
mv "$file" $(printf "%.2d-%s" ${COUNT} "$file")
((COUNT++))
done
这可以避免许多问题,并且还包括前9个文件的2位数字(接下来的90个2位数字,之后你会获得3位数字等)。
答案 1 :(得分:0)
这是一个解决方案。
i=1
for f in $(find ./uff -mindepth 1 -maxdepth 1 -type f | sort)
do
n=$i
[ $i -lt 10 ] && n="0$i"
echo "$f" "$n-$(basename "$f")"
((i++))
done
在这里它是一个单行(但在现实生活中,如果你曾经尝试过任何远程的东西,如下面的编码或操作采访中你不仅没有找到工作,你可能会给面试官创伤后应激障碍。他们在冷汗中醒来,想着你的解决方案有多糟糕。)
i=1; for f in $(find ./uff -mindepth 1 -maxdepth 1 -type f | sort); do n=$i; [ $i -lt 10 ] && n="0$i"; echo "$f" "$n-$(basename "$f")" ; ((i++)); done
或者,如果您想在同一目录中重命名它们,可以cd ./uff
,然后使用find .
(以及其他查找参数)清除所有内容。我假设你只想移动文件,而不是目录。而且我假设您不想递归重命名文件/目录。
答案 2 :(得分:0)
你可以试试这个;
#!/bin/bash
COUNT=1
for file in ./uff/*;
do
path=$(dirname $file)
filename=$(basename $file)
if [ $COUNT -lt 10 ]; then
mv "$file" "$path"/0"${COUNT}-$filename";
else
mv "$file" "$path"/"${COUNT}-$filename";
fi
COUNT=$(($COUNT+1));
done
例如:
user@host:/tmp/test$ ls uff/
abc.mp3 acc.mp3 bbb.mp3
user@host:/tmp/test$ ./test.sh
user@host:/tmp/test$ ls uff/
01-abc.mp3 02-acc.mp3 03-bbb.mp3
答案 3 :(得分:0)
好的,这里是没有循环的版本:
paste -d'\n' <(printf "%s\n" *) <(printf "%s\n" * | nl -w1 -s-) | xargs -d'\n' -n2 mv -v
如果您愿意,也可以使用find
:
paste -d'\n' <(find -mindepth 1 -maxdepth 1 -printf "%f\n") <(find -mindepth 1 -maxdepth 1 -printf "%f\n" | nl -w1 -s-) | xargs -d'\n' -n2 mv -v
将mv
替换为echo mv
以进行&#34;干运行&#34;:
paste -d'\n' <(printf "%s\n" *) <(printf "%s\n" * | nl -w1 -s-) | xargs -d'\n' -n2 echo mv -v