Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 以前缀和升序重命名文件夹中的所有文件_Bash_Shell_Unix - Fatal编程技术网

Bash 以前缀和升序重命名文件夹中的所有文件

Bash 以前缀和升序重命名文件夹中的所有文件,bash,shell,unix,Bash,Shell,Unix,如何重命名 random_files.jpg that\ may\ contain\ spaces.jpg and_differ_in_extensions.mp4 到 通过bash脚本?更正式地说,如何将目录中的所有文件重命名为一个有序的列表,其中前缀\u N.ext从原始文件名中保留.ext x=1;for i in *;do [[ -f "$i" ]] && mv "$i" "PREFIX_$((x++)).${i##*.}";done 下面是我的尝试 for f in

如何重命名

random_files.jpg
that\ may\ contain\ spaces.jpg
and_differ_in_extensions.mp4

通过bash脚本?更正式地说,如何将目录中的所有文件重命名为一个有序的列表,其中
前缀\u N.ext
从原始文件名中保留
.ext

x=1;for i in *;do [[ -f "$i" ]] && mv "$i" "PREFIX_$((x++)).${i##*.}";done
下面是我的尝试

for f in *; do 
    [[ -f "$f" ]] && mv "$f" "PREFIX_$f"
done 

只更改前缀。

您可以使用
*
循环文件,然后使用带引号的变量访问它们以保留所有特殊字符

然后,您可以使用参数扩展删除文件的开头,直到
,并将其附加到新文件名中

x=1;for i in *;do [[ -f "$i" ]] && mv "$i" "PREFIX_$((x++)).${i##*.}";done

如果您知道x尚未设置,但可以在开始时删除赋值,并将
$((x++)
更改为
$(++x))

您可以在for循环中使用
查找

while IFS= read -rd '' file; do
   ext="${file##*.}"
   echo mv "$file" "PREFIX_$((++i)).$ext"
done < <(find . -type f -name '*.*' -maxdepth 1 -print0)
而IFS=read-rd“”文件;做
ext=“${file##*.}”
echo mv“$file”前缀_$(++i)).$ext

已完成<切换到目录并运行:
for f in*;do[-f“$f”]&&mv“$f”前缀;完成
更改前缀。我喜欢“echo mv…”技术在运行脚本之前测试脚本。