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*后停止
编辑:如果愿意,可以用回车替换代码中的分号,这样可能更容易阅读。此外,您还可以通过这种方式将整个块粘贴到终端中,即使这可能不是很明显。嗯,不是直接粘贴,但它是一个单行线(编辑:不再): 编辑:也许我应该指出我的解决方案:
:使用一个数字作为文件名,为每个jpg文件执行循环体。将整个文件名存储在对于[0-9]中的i.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