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)
另一种使用以下方法保留扩展名(如果存在)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)
使用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)
归档时间: |
|
查看次数: |
6953 次 |
最近记录: |