Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 - Fatal编程技术网

Bash 反转文件名中的数字

Bash 反转文件名中的数字,bash,Bash,所以,在尝试创建更具可读性的文件结构时,我似乎犯了一个错误。我不小心按错误的顺序命名了文件,现在我需要更正它 这些文件的名称为: 001-文件号1.jpg 001-文件号2.mp3 002-文件号3.jpg 002-文件号4.mp3 003-文件号5.jpg 003-文件号6.mp3 我认为一个文件夹中有800个文件,另一个文件夹中有300个,这有点乱 正确的顺序应该是: 003-文件号1.jpg 003-文件号2.mp3 002-文件号3.jpg 002-文件号4.mp3 001-文件号

所以,在尝试创建更具可读性的文件结构时,我似乎犯了一个错误。我不小心按错误的顺序命名了文件,现在我需要更正它

这些文件的名称为:

  • 001-文件号1.jpg
  • 001-文件号2.mp3
  • 002-文件号3.jpg
  • 002-文件号4.mp3
  • 003-文件号5.jpg
  • 003-文件号6.mp3
我认为一个文件夹中有800个文件,另一个文件夹中有300个,这有点乱

正确的顺序应该是:

  • 003-文件号1.jpg
  • 003-文件号2.mp3
  • 002-文件号3.jpg
  • 002-文件号4.mp3
  • 001-文件号5.jpg
  • 001-文件号6.mp3

如何重命名所有文件,并更改编号,使其顺序相反?

排序中使用param
-r
→ <代码>排序-r文件

排序中使用参数
-r
→ <代码>排序-r文件

如果要按照区域设置的排序顺序执行反转:

name=(*.{jpg,mp3})
pfix=("${name[@]%% *}")
for ((i=0,j=${#name[@]}-1; j>=0; i++,j--)); do
  echo mv "${name[i]}" "${pfix[j]} ${name[i]#* }"
done
用文件名填充一个数组,用前缀填充另一个数组;在两个相反的方向上循环,并以相反的顺序重新配对


如果echo的输出看起来不错,则删除它。可能会抱怨目标和源只有一次是相同的,但这不会造成任何伤害。

如果要按照区域设置的排序顺序执行反转:

name=(*.{jpg,mp3})
pfix=("${name[@]%% *}")
for ((i=0,j=${#name[@]}-1; j>=0; i++,j--)); do
  echo mv "${name[i]}" "${pfix[j]} ${name[i]#* }"
done
用文件名填充一个数组,用前缀填充另一个数组;在两个相反的方向上循环,并以相反的顺序重新配对


如果echo的输出看起来不错,则删除它。可能会抱怨目标和源只有一次是相同的,但这不会造成任何伤害。

不确定这会在大量文件上扩展到多大程度,但就是这样

#!/usr/bin/env bash

shopt -s  extglob nullglob

file=(*.@(mp3|jpg))

mapfile -t -d '' files < <(printf '%s\0' "${file[@]}")

mapfile -t -d '' renamed < <(paste -zd ' ' <(printf '%s\0' "${files[@]%% *}" | sort -rz ) <(printf '%s\0' "${files[@]#* }"))

for i in "${!files[@]}"; do
  echo mv -v "${files[$i]}" "${renamed[$i]}"
done
  • 它将抛出一条错误消息,如@oguz发布的内容

  • bash4+
    只是因为
    mapfile

  • 另外,
    粘贴
    排序
    上的
    -z
    可能仅为
    GNU

如果您有实用工具
vidir
,则可以使用您喜爱的文本编辑器重命名文件,这是另一个选项。需要注意的是,它不支持带有换行符的文件/路径名

vidir /path/to/files
使用您喜爱的文本编辑器

EDITOR=kate vidir /path/to/files

如果这是您第一次使用
vidir
,那么我建议您先在一些测试文件上试用。第一列只是文件/目录的增量。不要触摸它。

不确定这在大量文件上的扩展效果如何,但它在这里

#!/usr/bin/env bash

shopt -s  extglob nullglob

file=(*.@(mp3|jpg))

mapfile -t -d '' files < <(printf '%s\0' "${file[@]}")

mapfile -t -d '' renamed < <(paste -zd ' ' <(printf '%s\0' "${files[@]%% *}" | sort -rz ) <(printf '%s\0' "${files[@]#* }"))

for i in "${!files[@]}"; do
  echo mv -v "${files[$i]}" "${renamed[$i]}"
done
  • 它将抛出一条错误消息,如@oguz发布的内容

  • bash4+
    只是因为
    mapfile

  • 另外,
    粘贴
    排序
    上的
    -z
    可能仅为
    GNU

如果您有实用工具
vidir
,则可以使用您喜爱的文本编辑器重命名文件,这是另一个选项。需要注意的是,它不支持带有换行符的文件/路径名

vidir /path/to/files
使用您喜爱的文本编辑器

EDITOR=kate vidir /path/to/files
如果这是您第一次使用
vidir
,那么我建议您先在一些测试文件上试用。第一列只是文件/目录的增量,不要触摸它