我正在尝试编写一个脚本,将目录作为命令行参数,并遍历目录中的文件并将其扩展名更改为.bu
。
我以为这会起作用,但我得到的输出'.bu' is not a target directory
#!/bin/bash
for f in $1; do
mv "$f".* .bu
done
答案1
#!/bin/bash
cd $1
for f in *; do
mv "$f" "${f%.*}.bu"
done
答案2
尝试一下这个(假设这$1
是一个文件夹):
for f in $1/*; do
mv "$f" "$f.bu"
done
或者使用重命名实用程序:
rename -v 's/$/\.bu/' $1/*
这些命令添加了扩展。如果你想更改现有的扩展使用:
rename -v 's/\.[^\.]+$/\.bu/' $1/*
答案3
采用 KISS 方法,我推荐以下脚本
#! /bin/bash
cd $1;
rename 's/$/\.bu/' *
这会将工作目录更改为第一个参数,然后.bu
为所有文件添加扩展名。这样就不再需要 for 循环了。
编辑:
如果你想更改扩展名(而不仅仅是添加它),你可以尝试
rename 's/\..*$/\.bu/' *
在上面的脚本中,改为使用命令。
答案4
$1
脚本中的bash
是对从命令行传递的第一个参数的引用,因此您实际上是在尝试处理单个文件夹。
关于如何使用纯解决您的问题已经有答案了bash
,但我想补充一点,如果您需要更好地过滤正在处理的内容,您可以使用find
一些选项来选择要处理的文件:
find <path_to_directory> -maxdepth 1 -type f
*<path_to_directory> = 目录路径
然后使用重定向循环遍历文件列表stdin
:
#!/bin/bash
while read file
do
rename 's/\..*/\.bu/' $file
done <<< $(find $1 -maxdepth 1 -type f)