通常,您只需要打开Shotwell并将其拖动到文件夹中即可。
如果需要,可以使外壳程序构建一个CR2文件列表,并告诉Shotwell仅打开这些文件。有时候这可能是您想要的,但在这种情况下,由于Shotwell的行为(在某些其他情况下,该功能会自动显示您居住在与您打开的图像相同的文件夹。
为了确保Shotwell只知道您感兴趣的图像,您可以将目录树克隆到其他位置,仅复制.cr2
文件和包含它们的文件夹,而不复制其他文件。但是,这可能会占用大量的额外空间。因此,另一种方法是建立一个分层符号链接 -在那里,而不必为一个新的目录树的副本,你的原始.cr2
文件,你有一个新的目录树syminks给他们。这将占用更少的空间。
这个答案涵盖了所有这些方法。
在Shotwell中打开图像文件夹(包括子文件夹)
Shotwell本身为您提供了两种方法来打开整个目录的照片树。如果这些对您有用,那么您将不需要在命令行中做任何聪明的事情,甚至根本不需要使用它。如果不是这样,您可能最终会结合其他技术来执行此操作。(例如,如果最终创建了符号链接或.cr2
文件副本的新目录,则可以使用以下一种方法将其打开。)
方法1:只需在Shotwell中打开整个文件夹。
在Shotwell的“ 文件”菜单中,单击“ 从文件夹导入”。然后选择要从中导入图像的文件夹。这将不仅限于.cr2
文件,但是如果您要从多个子文件夹中打开文件,这些子文件夹中包含.cr2
通过数码相机创建的图像,则很可能只有这些文件存在。
见雅各布的回答来递归显示所有图片(包括所有子文件夹)了解更多信息。
方式2:将文件夹拖到Shotwell中。
在大多数桌面环境和文件浏览器中,您也可以打开Shotwell并将包含图像的文件夹拖到Shotwell窗口中。就像从文件夹导入一样,这是Shotwell建议打开照片的另一种方式。
从文件浏览器窗口或桌面拖动到Shotwell时,可以拖动到特定的库。或者,如果您没有设置多个库,则基本上可以将其拖到任何地方,并且它可以工作。(您甚至不必拖动到左窗格中。)
该方法非常方便,并且与手动选择文件夹一样强大(如上所述,使用“ 文件” >“ 从文件夹导入”)。当您使用上述两种方法之一打开文件或文件夹时,Shotwell都可以选择打开照片而不将其复制到其库中。
要导入而不进行复制,请单击“ 就地导入”,而不是“ 复制照片”。
使用映像文件名列表启动Shotwell
如果出于某些原因想要或需要通过在终端中运行命令来执行此操作,则可以运行该shotwell
命令并将每个图像的文件名作为参数传递给它。Globstar使它变得容易:
shopt -s globstar
shotwell **/*.cr2
这将打开.cr2
当前目录中任意位置的文件。它与运行Shotwell然后拖动文件夹不同,因为Shotwell仅尝试导入您为其命名的文件。但是,由于Shotwell通常会显示与您要打开的文件相同的文件夹中的其他图像文件,因此这可能不足以满足您的需求。(您提供的有关该问题的更多信息表明,事实并非如此。请参阅下文,了解替代方法。)
这不包括名称以开头的文件或子文件夹.
。但是,如果你有CR2文件的名字开始与一个点,随后大部分时间,你可能不希望在肖特韦尔打开他们无论如何。除非您以这种方式故意命名了文件或文件夹,否则带有图像或文档文件名扩展名的点文件更有可能是元数据文件,而不是实际的图像或文档。例如,macOS在访问外部媒体(包括闪存驱动器和数码相机)时经常添加此类文件(例如,._kittens.cr2
用于实际图片kittens.cr2
)。
如果您确实还想查找名称以开头的文件,.
或者在名称以开头的文件夹中的文件.
,请同时启用dotglob。你可以做到这一点shopt -s dotglob
或者同时传递globstar
,并dotglob
在shopt
内置:
shopt -s globstar dotglob
默认情况下,glob区分大小写。但是,您可能希望以不区分大小写的匹配文件名,这样才能在截至打开的文件.cr2
,.Cr2
,.cR2
,和.CR2
。为此,可以:
通过运行启用nocaseglob shopt -s
与nocaseglob
自身或与其他壳选择。例如,要shotwell
在所有.cr2
文件上运行,不区分大小写地进行搜索,并包括.
-files和.
-directories中的文件:
shopt -s globstar dotglob nocaseglob
shotwell **/*.cr2
或者,在您的全局模式本身中使用.[cC][rR]2
代替.cr2
。例如,这完成与上面相同的操作:
shopt -s globstar dotglob
shotwell **/*.[cC][rR]2
请注意,是否区分大小写与.
文件和文件夹是否匹配完全不同。您可以dotglob
从上面的示例中删除,它们仍然不区分大小写。
要指定目录而不是仅使用当前目录,请将其名称和a /
放在**/*.cr2
全局名称之前。例如,用此shotwell
命令替换上面的命令将打开主目录子目录.cr2
内的所有文件Pictures
:
shotwell ~/Pictures/**/*.cr2
与使用当前目录的第一个命令不同,无论您在何处运行该命令,都将告诉Shotwell打开相同的文件。
测试中
如果您真的必须使用终端,那么我想它可能是更复杂的一部分。如果愿意,您可以在实际运行这些命令之前通过将其替换shotwell
为来测试这些命令printf '%s\n'
。不是将文件名传递给Shotwell,而是每行列出一个文件名。例如,在我的机器上:
ek@Io:~$ printf '%s\n' ~/tmp/**/*.cr2
/home/ek/tmp/another image.cr2
/home/ek/tmp/image.cr2
/home/ek/tmp/some folder/image3.cr2
关闭Globstar和其他Shell选项
globstar shell选项已启用,这是上述shopt -s globstar
命令的作用。如果已经启用,则不需要多个命令。而且,每个shell实例只需设置一次globstar。
您可以通过运行以下命令关闭globstar:
shopt -u globstar
您可以通过运行以下命令来检查 globstar是打开还是关闭:
shopt globstar
如果您在脚本中使用globstar,则如果同一脚本中随后可能有一些代码不是以globstar编写的,则应考虑将其关闭。例如,禁用globstar **
时,按您的意思进行编写*
通常是没有问题的,但是在启用globstar的情况下,使命令影响的文件远远多于某人的意图,可能会导致严重的问题。
同样,如果您使用dotglob或nocaseglob并希望将其关闭,则可以分别使用shopt -u dotglob
和shopt -u nocaseglob
。您还可以传递多个外壳程序选项以shopt -u
同时取消设置它们。例如,关闭globstar,
dotglob
和nocaseglob
:
shopt -u globstar dotglob nocaseglob
与globstar相比,您可能会犯的严重错误更少,因为您忘记了将dotglob或nocaseglob留在了上面。但是其他人(包括您在Ask Ubuntu等网站上咨询的人)通常会在建议您使用命令时假定dotglob和nocaseglob被禁用,除非您另行告知。
有关这些水珠相关壳选项的详细信息(以及关于在一般水珠),请参阅bash的参考手册。它们全部在4.3.2 Shopt Builtin中涵盖。对于globstar,另请参见3.5.8.1模式匹配。对于dotglob,另请参见3.5.8文件名扩展。
建立一个新的目录树
由于您的情况似乎确实需要Shotwell 仅 显示.cr2
文件,因此非.cr2
文件与.cr2
文件位于同一文件夹中,而Shotwell中的图像浏览也会自动提供这些文件,因此您似乎需要具有一个文件夹除.cr2
您要打开的文件外,不包含其他图像文件。
移动文件,你建议,是一种方法,但我建议,而不是要么复制的文件,或者更好,使符号链接到文件(见FOLDOC),这是因为:
- 如果要跨设备移动文件,则无论如何都需要复制,因此在这种情况下移动速度不会更快。
- 如果有足够的空间,通常最好保留所有未修改的文件夹,直到您对自己所做的一切根据自己的需要是正确的感到满意为止。显然,这并不总是适用或实际的。但就您而言,这些文件是数据恢复操作的结果。保留易于阅读的记录,准确地记录了从何处恢复了什么。
- 如果选择创建符号链接,则消耗的额外空间量非常小。(不过,如果目标磁盘已完全满,那么您仍然需要释放其上的空间-或使用其他目标磁盘-创建符号链接。)
您还要做出另一个决定。您是否在同一目录中创建所有新条目(无论是副本还是符号链接),从而使文件层次结构扁平化?还是在目标位置创建与包含至少一个.cr2
文件的源目录中的每个目录相对应的目录?
展平文件层次结构使您可以轻松一次查看所有文件。特别是,很容易一次查看所有文件的名称和大小,以及在图形文件浏览器中选择文件的任何组合。
但这也会丢失有关它们所在文件夹的信息,这可能很有价值(尽管如果您不移动文件,则可以返回原始文件夹并在其中查找它们)。
但是,扁平化文件层次结构的最大问题是,如果在不同位置有两个或多个同名文件,则会发生什么情况。如果将文件层次结构展平,则根据您的操作方式,除了第一个副本之外的所有对象都将无法复制(或链接),并且您将收到错误或警告,或者除最后一个副本之外的所有内容(或链接)都将被复制。被覆盖。
这是我建议复制或进行符号链接而不是移动文件的另一个原因。如果您“成功”将多个文件移动到同一文件中,那么除了最后一个文件,您已经丢失了所有文件!
由于将所有内容压平到一个没有子目录的目录中的缺点,我在这里采用的方法是在目标位置建立一个新的目录树。
方法1:复制
我首先展示它是因为它有点简单,但是我建议您创建符号链接(“ Way 2”),尤其是在目标驱动器可能没有足够空间容纳所有文件的情况下。“方法2”稍微复杂一些,因为它使用的技术似乎更少,这是我希望大多数人在这种情况下会偏爱的方式,并且信息适用于这两种方法-有关在路径中转义空间的基本建议-在此处而不是此处。
当您需要复制目录树并且需要自定义复制操作时,通常应使用rsync
代替cp
。这是其中一种情况。
替换src
为包含所有CR2文件的顶级目录的路径,并替换dest
为要创建的目录名称,该目录将包含指向CR2文件的符号链接的层次结构,运行:
rsync -rl --prune-empty-dirs --include='*/' --include='*.cr2' --exclude='*' src/ dest
不要忘记/
源目录的名称后面的,除非您要在内部创建一个附加的顶层目录dest
。就是说,如果您省略了结尾/
,rsync
则将在其中创建目标目录dest
。例如,假设src
是一个包含no的相对路径/
。然后:
- 随着
src/
在你的rsync
命令,你会得到一个符号链接dest/foo/bar.cr2
的文件src/foo/bar.cr2
。
- 随着
src
在你的rsync
命令,你会得到一个符号链接的文件。dest/src/foo/bar.cr2
src/foo/bar.cr2
由于放置符号链接的顶级目录的名称与包含.cr2
符号链接指向的文件的顶级目录的名称相同,因此可能会造成混淆,因此建议您/
在目标末尾添加rsync
命令中的目录名称。(并且,对于源目录,请为它提供一个空目录,一个不存在的目录或专用于此目的的目录。否则,您将使其他文件夹杂乱无章。)
由于一般情况下,当你通过一个文件或目录的命令行程序或脚本的名称,如果你的目标或源目录路径包含由外壳,好像经过特殊处理的任何空格(或字符\
,$
,'
和各种其他标点符号),则您必须引用它们。对于“空格2”中最常见的空格,我已经详细介绍了如何执行此操作-该部分中有关引用的建议也适用于此。但是,如果不确定如何引用文件夹的名称,则可以通过简单地将文件夹拖到Temrminal中来让Ubuntu为您完成。它的完整路径将被正确引用粘贴。
仅复制.cr2
文件和包含它们的文件夹后,您可以在Shotwell中打开目标文件夹。(请参阅上面的“在Shotwell中打开图像文件夹(包括子文件夹)”。)但是,在运行之前rsync
,我建议您确定是否要跳过开头的条目,.
以及是否要包含带有大小写不同后缀的条目。如果是这样,您将必须运行一些稍微不同的rsync
命令。
自定义虚线条目的处理方式和区分大小写
您可能想使用其他rsync
命令来更改是否跳过以点开头的文件和目录,以及是否要在区分后缀时区分大小写.cr2
。
上面的命令确实包含名称以开头的目录和文件.
。要排除此类文件和目录,请放在--exclude='.*/' --exclude='.*'
所有其他--include
s和--exclude
s之前。即,使用该rsync
命令代替(与适当的取代src
和dest
,当然):
rsync -rl --prune-empty-dirs --exclude='.*/' --exclude='.*' --include='*/' --include='*.cr2' --exclude='*' src/ dest
该rsync
显示的命令迄今已区分大小写的,并不会复制文件结束.CR2
,.Cr2
或者.cR2
不是.cr2
。如果您希望复制此类文件,则需要使用--include
模式*.[cC][rR]2
代替来解决*.cr2
。
这第三个命令是不区分大小写和(如第一个命令)并不能跳过的文件和目录的名字开始.
:
rsync -rl --prune-empty-dirs --include='*/' --include='*.[cC][rR]2' --exclude='*' src/ dest
如果您使用的方式复制文件rsync
,但不确定要使用哪个命令,则建议您使用该命令以确保不要错过任何内容。但是,您应该注意,点文件可能包含元数据,而像图像一样命名的点文件可能实际上不是图像。请参阅上面“使用图像文件名列表启动Shotwell”部分中关于点文件的讨论,以及下面“方法2”中有关点文件和区分大小写的讨论。
第四个命令不区分大小写,并且(与第二个命令一样)不跳过名称以.
以下开头的文件和目录:
rsync -rl --prune-empty-dirs --exclude='.*/' --exclude='.*' --include='*/' --include='*.[cC][rR]2' --exclude='*' src/ dest
方法2:创建符号链接
我建议您这样做,但是如果目标驱动器上有足够的空间,则方法1可以。您无需阅读方法1即可使用它。
此处介绍的方法.cr2
创建文件列表并在列表中循环,根据需要创建目标目录,并使用指向每个.cr2
文件的符号链接填充目标目录。
这非常复杂,我建议将其放入脚本中,而不是仅以交互方式键入。您可以将脚本放置在任意位置,但是为了方便起见,我将展示如何将脚本直接放置在主文件夹中。
编写(或粘贴)脚本。
make-symlinks
在主文件夹中创建一个文本文件。不需要文件扩展名。
您可以使用任何文本编辑器(例如Vim,Nano,Gedit或Leafpad)进行此操作。但是,请勿使用像LibreOffice Writer这样的文字处理器。(如果需要,您甚至可以通过运行cat > ~/make-symlinks
,粘贴文件内容,然后在新行上按Ctrl+ D来执行此操作。)
如果您给脚本命名的不是make-symlinks
,请确保稍后运行使用该脚本的命令时使用该名称。
#!/bin/bash
shopt -s globstar dotglob nocaseglob
for f in **/*.cr2; do
mkdir -p "$1/$(dirname "$f")"
ln -s "$PWD/$f" "$1/$f"
done
将其放入文件中,然后保存文件。该脚本使用globstar,这是Bash功能,已在上面的“使用图像文件名列表启动Shotwell”中介绍过。
您可以更改其处理点输入和区分大小写的方式。
根据您的需要,您可能需要进行一些更改:
如果您不想包含.cr2
名称以开头的文件,.
或者不包含名称以开头的目录中的文件.
,请dotglob
从该shopt
行中删除。
名称以开头的文件和目录.
通常用于元数据(请参阅上面的“使用图像文件名列表启动Shotwell”部分)。另一方面,如果您想确保拥有所有东西,或者如果您不确定有什么莫名其妙的缺失,那么应该保留dotglob
。
如果你想只包括文件正是为此.cr2
而不是变体情况下(.CR2
,.Cr2
,和.cR2
),那么你就应该删除nocaseglob
。由于您的情况涉及数据恢复,因此在打开符号链接目录时,Shotwell不会显示任何丢失的文件 -毕竟,这就是此方法的重点-您可能希望保留nocaseglob
。
使它可执行。
运行以下命令以将脚本标记为可执行文件:
chmod +x ~/make-symlinks
在源代码处运行它,并将目的地作为参数传递。
然后将目录更改为源目录,即包含图片的顶级文件夹。例如,如果它们位于Pictures
主目录的子目录中,则应运行:
cd ~/Pictures
这是您运行脚本的地方。将目标目录作为命令行参数传递给脚本。
例如,如果要cr2s
在桌面上创建一个名为目录的目录,以包含符号链接,请运行:
~/make-symlinks ~/Desktop/cr2s
或者,如果您只想将该目录直接放在主文件夹中:
~/make-symlinks ~/cr2s
或者,如果您安装了驱动器,/media/you/MyDrive
并且想要在其上创建一个文件夹以调用该文件夹links
以包含符号链接:
~/make-symlinks /media/you/MyDrive/links
但是,如果驱动器是/media/you/My Drive
(带有空格),则必须使用引号。这些工作中的任何一项(仅使用其中一项,请不要全部运行):
~/make-symlinks '/media/you/My Drive/links'
~/make-symlinks /media/you/'My Drive'/links
~/make-symlinks /media/you/My\ Drive/links
但是,如果~
用于主目录,请不要引用:
~/make-symlinks ~/'Two Words' # good
~/make-symlinks ~/Two\ Words # good
~/make-symlinks '~/Two Words' # BAD, because ~ doesn't get expanded
make-symlinks
创建目标目录(如果尚不存在),就像在其中创建子目录一样。但是,如果目标已经存在,它仍然可以工作。
您甚至可以多次运行它并传递相同的目标目录(例如,如果您用Ctrl+ 中断了它C),尽管您会failed to create symbolic link
因已经存在的符号链接而出错,这可能会造成混淆。
您可能不想将已经存在并且包含无关文件(例如您的主目录)的目录的名称传递给make-symlinks
。如果这样做,可以期望在其中创建大量符号链接和子文件夹。您可能想使用一个新目录-或尚不存在的目录make-symlinks
。
将新创建的符号链接树导入Shotwell。
运行之后make-symlinks
,使用此答案第一部分中给出的任何一种方法(“在Shotwell中打开图像文件夹(包括子文件夹)”),只需将传递给它的目录导入Shotwell。例如,您可以打开Shotwell并将文件夹拖入其中。
由于文件夹中的所有条目都是指向.cr2
文件或包含它们的目录的符号链接,没有其他文件类型,因此Shotwell应该看不到任何其他文件。