【问题标题】:Bash script to copy numbered files in reverse orderBash脚本以相反的顺序复制编号的文件
【发布时间】:2011-10-31 11:05:40
【问题描述】:

我有一系列文件:

image001.jpg
image002.jpg
image003.jpg

你能帮我写一个 bash 脚本,它以相反的顺序复制图像,因此最终结果是:

image001.jpg
image002.jpg
image003.jpg
image004.jpg  <-- copy of image003.jpg
image005.jpg  <-- copy of image002.jpg
image006.jpg  <-- copy of image001.jpg

括号中的文字不是文件名的一部分。

我为什么需要它?我正在从一系列图像创建视频,并希望视频“向前”播放,然后“向后”播放(循环播放生成的视频)。

【问题讨论】:

  • 为什么不将图像列表向前然后向后提供给视频创建工具?
  • 因为我正在使用几个命令行工具,例如 gifsicle(制作 gif)和 ffmpeg(制作 mpg),并且正在处理可能超过长度的大量(100-200 张图像)一个可接受的命令。还是没有这个限制?
  • 这取决于您的工具如何获取文件名作为输入。不幸的是,ffmpeg 似乎没有办法将包含文件名列表的文件作为输入。
  • gifsicle 也没有 :-( 但是下面提供的脚本效果很好。

标签: linux bash sequence rename


【解决方案1】:

您可以使用printf 打印带有前导0 的数字。

$ printf '%03d\n' 1
001
$ printf '%03d\n' 2
002
$ printf '%03d\n' 3
003

将其放入 for 循环产生:

MAX=6

for ((i=1; i<=MAX; i++)); do
    cp $(printf 'image%03d.jpg' $i) $(printf 'image%03d.jpg' $((MAX-i+1)))
done

【讨论】:

  • 不错的脚本,但它会生成冗余副本。无论如何 +1。
  • 对于给定的情况,最好使用ln 而不是cp 文件。
  • 应该是for ((i=1; i&lt;=MAX/2; i++)); 吗?或者我猜结果是一样的,所以更简单的版本更好
  • @glglgl,这是一个有趣的想法。你能给出ln 命令吗?我是做符号链接还是硬链接?
  • 同上,但只是 ln 而不是 cp。如果要创建符号链接(由您决定),请添加 -s。两种类型的链接都可以在这里使用。
【解决方案2】:

我认为我会为此使用一个数组...这样,您不必为 $MAX 硬编码一个值。

image=( image*.jpg )
MAX=${#image[*]}
for i in ${image[*]}
do
   num=${i:5:3} # grab the digits
   compliment=$(printf '%03d' $(echo $MAX-$num | bc))
   ln $i copy_of_image$compliment.jpg
done

我使用 'bc' 进行算术运算,因为 bash 将前导 0 解释为数字是八进制的指示符,并且 bash 中的参数扩展功能不足以在不跳过箍的情况下剥离它们。我本可以在 sed 中做到这一点,但只要我在 bash 之外调用某些东西,直接进行算术运算就同样有意义。

我想 Kuegelman 的脚本可以做这样的事情:

MAX=(ls image*.jpg | wc -l)

该脚本有更大的问题,因为它覆盖了一半的图像:

cp image001.jpg image006.jpg # wait wait!!! what happened to image006.jpg???

此外,一旦超过 007,就会遇到八进制问题。

【讨论】:

  • 如果文件名中存在非法字符(例如下划线),则会失败。 BC 不喜欢它。
猜你喜欢
  • 1970-01-01
  • 2015-03-14
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2021-08-23
相关资源
最近更新 更多