使用find shell重命名文件夹中的文件

时间:2016-10-11 06:40:27

标签: shell unix sh

我有一个文件在不同的文件夹,如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的解决方案......提前致谢

4 个答案:

答案 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