假设我当前目录中有以下文件:
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中的文件执行一些正则表达式过滤,以获取旧目录中仍需要复制的文件名列表等。
答案 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 *后停止。
编辑:如果你愿意,你可以用回车替换我的代码中的分号,它可能更容易阅读。此外,您可以通过这种方式将整个块粘贴到终端中,即使这可能不会立即显而易见。