Linux Bash命令只移动一些文件?

Linux Bash命令只移动一些文件?,linux,bash,shell,Linux,Bash,Shell,假设我的当前目录中有以下文件: 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.

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

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位于它们自己的目录中

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

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

integer=0;而[$integer-le9];do if[-e${integer}original.jpg];然后mv-vi${integer}.jpg${integer}original.jpg lol/;fi;整数=$[$integer+1];完成

注意,这里,“lol”是目标目录。你可以把它换成你喜欢的任何东西。此外,您还可以在[$integer-le 9]中更改
9
以检查大于9的整数。现在它从0*开始,在检查9*后停止


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

嗯,不是直接粘贴,但它是一个单行线(编辑:不再):

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

  • 对于[0-9]中的i.jpg
    :使用一个数字作为文件名,为每个jpg文件执行循环体。将整个文件名存储在
    $i
  • orig={i%.}original.jpg
    :在
    $orig
    中保存“原始文件”的可能文件名
  • [-f$orig]
    :通过
    测试(1)
    […]
    内容)检查
    $i
    的原始文件是否存在。如果是,请将两个文件移动到另一个目录。这是通过
    &&
    完成的:只有在测试成功的情况下,才会执行后面的部分

以下内容可以工作并且易于理解(用输出目录替换
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

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

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

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
模式替换的一个例子。它从
f
的值中删除第一个出现的字符串“original”。因此,如果
f
是字符串“1original.jpg”,那么
${f/original/}
是字符串“1.jpg”.

这适用于任何严格的数字前缀,即
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”
是真的。

这就是超级用户学习编程的原因:)好问题。您是否需要担心这样的情况,比如说,
5original.jpg
但是没有
5.jpg
?谢谢,您能展示一个基于上述文件名的示例解决方案吗?从示例解决方案中,我可以从一个易于阅读和维护的方式来考虑格式化您的代码。您应该将代码格式化为多行,以便更容易阅读。另外,您可以避免将basename与
${i##*/}
一起使用。谢谢。避免使用basename并使用模式匹配是一个好主意,但是
${i##*/}
对我不起作用。我改用了
${I%.*}
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