9

假设我的当前目录中有以下文件:

1.jpg
1original.jpg
2.jpg
2original.jpg
3.jpg
4.jpg

是否有终端/bash/linux 命令可以执行类似的操作

if the file [an integer]original.jpg exists,
    then move [an integer].jpg and [an integer]original.jpg to another directory.

执行这样的命令会导致 1.jpg、1original.jpg、2.jpg 和 2original.jpg 在它们自己的目录中。

注意 这不一定是一个命令。我可以是简单命令的组合。也许类似于将原始文件复制到新目录。然后对新目录中的文件进行一些正则表达式过滤,以从旧目录中获取仍然需要复制的文件名列表等。

4

6 回答 6

6

打开扩展 glob 支持将允许您编写类似正则表达式的模式。这可以处理具有多位整数的文件,例如“87.jpg”和“87original.jpg”。然后可以使用 Bash 参数扩展从找到的文件的名称中去除“原始”,以允许您将两个相关文件一起移动。

shopt -s extglob
for f in +([[:digit:]])original.jpg; do
    mv $f ${f/original/} otherDirectory
done

在扩展模式中,+( x )匹配括号内的一个或多个内容,类似于正则表达式x+。这里,x是任何数字。因此,我们匹配当前目录中名称由 1 个或多个数字后跟“original.jpg”组成的所有文件。

${f/original/}bash' 模式替换的一个例子。它从 的值中删除字符串“original”的第一次出现f。所以如果f是字符串“1original.jpg”,那么${f/original/}就是字符串“1.jpg”。

于 2012-07-30T20:00:16.180 回答
3

好吧,不是直接的,但它是一个单线器(编辑:不再):

for i in [0-9].jpg; do
  orig=${i%.*}original.jpg
  [ -f $orig ] && mv $i $orig another_dir/
done

编辑:也许我应该指出我的解决方案:

  • for i in [0-9].jpg: 对每个以一个数字为文件名的 jpg 文件执行循环体。将整个文件名存储在$i
  • orig={i%.*}original.jpg:保存$orig“原始文件”的可能文件名
  • [ -f $orig ]:通过test(1)[ ... ]东西)检查原始文件是否$i存在。如果是,请将两个文件移至another_dir. 这是通过以下方式完成&&的:只有在测试成功时才会执行它之后的部分。
于 2012-07-30T19:21:02.947 回答
2

这应该适用于任何严格的数字前缀,即234.jpg

for f in *original.jpg; do
  pre=${f%original.jpg}
  if [[ -e "$pre.jpg" && "$pre" -eq "$pre" ]] 2>/dev/null; then
    mv "$f" "$pre.jpg" targetDir
  fi
done

"$pre" -eq "$pre"如果不是整数,则给出错误

编辑:
如果存在original.jpg并且.jpg两者都存在,这将失败。
$pre然后是空字符串并且"$pre" -eq "$pre"是真的。

于 2012-07-30T20:25:01.893 回答
1

以下内容可行且易于理解(替换out为输出目录,并替换{1..9}为您的数字的实际范围。

for x in {1..9}
do
if [ -e ${x}original.jpg ]
then
mv $x.jpg out
mv ${x}original.jpg out
fi
done

您显然也可以将其作为单行输入。

于 2012-07-30T19:24:02.963 回答
-1

您可以使用 Regex 语句在您正在查看的文件名中查找“匹配项”。然后对找到的“匹配项”执行操作。

于 2012-07-30T19:14:10.273 回答
-1

integer=0; while [ $integer -le 9 ] ; do if [ -e ${integer}original.jpg ] ; then mv -vi ${integer}.jpg ${integer}original.jpg lol/ ; fi ; integer=$[ $integer + 1 ] ; done

请注意,这里的“lol”是目标目录。您可以将其更改为您喜欢的任何内容。此外,您可以更改9inwhile [ $integer -le 9 ]以检查大于 9 的整数。现在它从 0* 开始,并在检查 9* 后停止。

编辑:如果你愿意,你可以用回车替换我的代码中的分号,这样可能更容易阅读。此外,您可以通过这种方式将整个块粘贴到终端中,即使这可能不会立即显现出来。

于 2012-07-30T19:18:52.243 回答