Bash命令只移动一些文件?

时间:2012-07-30 19:06:13

标签: 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.jpg,2.jpg和2original.jpg进入他们自己的目录。

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

6 个答案:

答案 0 :(得分: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模式替换的示例。它从f的值中删除第一次出现的字符串“original”。因此,如果f是字符串“1original.jpg”,那么${f/original/}就是字符串“1.jpg”。

答案 1 :(得分:3)

嗯,不是直接的,但它是一个oneliner(编辑:不再):

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。这是通过&&完成的:只有在测试成功后才能执行它之后的部分。

答案 2 :(得分: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为nullstring,"$pre" -eq "$pre"为真。

答案 3 :(得分: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

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

答案 4 :(得分:-1)

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

答案 5 :(得分:-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”是目标目录。您可以将其更改为您喜欢的任何内容。此外,您可以更改9中的while [ $integer -le 9 ]以检查大于9的整数。现在它从0 *开始并在检查9 *后停止。

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