重命名文件以添加后缀

Mar*_*oah 13 bash batch-rename

我需要一个命令来重命名当前工作目录中的所有文件,新文件名将与旧文件名相同,但包括与原始文件行数相对应的后缀(例如,如果文件f有 10行,则应将其重命名为f_10)。

这是我的(非工作)尝试:

 linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*
Run Code Online (Sandbox Code Playgroud)

ter*_*don 13

怎么样:

for f in *; do mv "$f" "$f"_$(wc -l < "$f"); done
Run Code Online (Sandbox Code Playgroud)

例如:

$ wc -l *
 10 file1
 40 file2
100 file3
$ ls
file1_10  file2_40  file3_100
Run Code Online (Sandbox Code Playgroud)

如果您想保留扩展名(如果存在),请改用:

for f in *; do 
    ext=""; 
    [[ $f =~ \. ]] && ext="."${f#*.}; 
    mv "$f" "${f%%.*}"_$(wc -l < "$f")$ext; 
done
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 10

你可以试试这个衬垫:

find . -maxdepth 1 -type f -exec bash -c 'mv -i "$1" "$1.$(wc -l <"$1")"' _ {} \;
Run Code Online (Sandbox Code Playgroud)
  • 这将找到当前工作目录中的所有文件 ( find . -maxdepth 1 -type f)

  • 然后我们在找到的文件上运行一个 shell 实例来重命名文件以追加行数。

例子 :

$ ls
bar.txt spam.txt foo.txt

$ find . -maxdepth 1 -type f -exec bash -c 'mv -i "$1" "$1.$(wc -l <"$1")"' _ {} \;

$ ls
bar.txt.12 foo.txt.24 spam.txt.7
Run Code Online (Sandbox Code Playgroud)


kos*_*kos 6

另一种使用以下方法保留扩展名(如果存在)rename

for f in *; do rename -n "s/([^.]+)(\.?.*)/\$1_$(< "$f" wc -l)\$2/" "$f"; done
Run Code Online (Sandbox Code Playgroud)

如果结果是预期的,请删除该-n选项:

for f in *; do rename "s/([^.]+)(\.?.*)/\$1_$(< "$f" wc -l)\$2/" "$f"; done
Run Code Online (Sandbox Code Playgroud)


A.B*_*.B. 5

使用find

find . -maxdepth 1 -type f -print0 | while read -d $'\0' f; do mv "$f" "$f"_$(grep -c . "$f"); done
Run Code Online (Sandbox Code Playgroud)

例子

% wc -l *
  3 doit
  5 foo

% find . -maxdepth 1 -type f -print0 | while read -d $'\0' f; do mv "$f" "$f"_$(grep -c . "$f"); done

% wc -l *                         
  3 doit_3
  5 foo_5
Run Code Online (Sandbox Code Playgroud)