use*_*884 9 command-line shotwell
就像是
shotwell *.cr2 ./
Run Code Online (Sandbox Code Playgroud)
这不起作用,但基本上我想使用 shotwell 打开所有.cr2以当前目录结尾的文件(包括子文件夹)
上下文是我丢失了我用相机拍摄的照片,这些照片后来从我的存储卡中删除了。
在 Shotwell 的“缺失图像”中有它们的缩略图,但我找不到它们。所以我想我会跑去photorec找他们。结果 photorec 给了我一大堆文件夹和文件,足以填满我的硬盘。我没有一个一个地筛选所有文件,而是决定在我的硬盘驱动器上搜索 .cr2 文件,同时避免Photogs我知道没有它们的特定文件夹,因为它们不是photorec数据转储的一部分。
通常,您只需打开 Shotwell 并拖入文件夹即可。
如果需要,您可以让 shell 构建一个 CR2 文件列表,并告诉 Shotwell 只打开这些文件。有时这可能是您想要的,但在这种情况下,由于 Shotwell 的行为——在其他一些情况下,一个功能——自动向您显示驻留在与您打开的图像相同的文件夹。
为了确保 Shotwell 只知道您感兴趣的图像,您可以将目录树克隆到其他地方,只复制.cr2文件和包含它们的文件夹,而不复制其他任何内容。不过,这可能会占用大量额外空间。因此,另一种方法是构建符号链接的层次结构——在这里,您没有原始文件副本的.cr2新目录树,而是拥有指向它们的符号链接的新目录树。这占用的空间要少得多。
这个答案涵盖了所有这些方法。
Shotwell 本身为您提供了两种打开整个照片目录树的方法。如果这些对你有用,那么你就不需要在命令行中做任何聪明的事情,甚至根本不需要使用它。如果没有,您最终可能会结合另一种技术来执行此操作。(例如,如果您最终创建了符号链接或.cr2文件副本的新目录,则可以使用以下方法之一打开它。)
在 Shotwell 中,在文件菜单中,单击从文件夹导入。然后选择要从中导入图像的文件夹。这不仅限于.cr2文件,但如果您从包含.cr2数码相机创建的图像的多个子文件夹中打开文件,那么这些文件很可能是唯一存在的文件。
见雅各布的回答来递归显示所有图片(包括所有子文件夹)了解更多信息。
对于大多数桌面环境和文件浏览器,您还可以打开 Shotwell 并将包含图像的文件夹拖到 Shotwell 窗口中。与从文件夹导入一样,这是 Shotwell 推荐的另一种打开照片的方式。
当您从文件浏览器窗口或桌面拖动到 Shotwell 中时,您可以拖动到特定的库。或者,如果您没有设置多个库,您基本上可以将其拖到任何地方,它就可以工作。(您甚至不必拖到左窗格中。)
这种方法非常方便,而且和手动选择文件夹一样强大(使用File > Import from Folder,如上所述)。当您使用这些方法之一打开文件或文件夹时,Shotwell 会为您提供打开照片的选项,而无需将它们复制到照片库中。
要在不复制的情况下导入,请单击原位导入而不是复制照片。
如果出于某种原因您希望或需要通过在终端中运行命令来执行此操作,您可以运行该shotwell命令并将每个图像的文件名作为参数传递给它。Globstar让一切变得简单:
shopt -s globstar
shotwell **/*.cr2
Run Code Online (Sandbox Code Playgroud)
这将打开.cr2位于当前目录中任何位置的文件。它不同于运行 Shotwell 然后将文件夹拖入其中,因为 Shotwell 只会尝试导入您为其指定名称的文件。但是,由于 Shotwell 经常显示与您让其打开的文件相同的文件夹中的其他图像文件,因此这可能不足以满足您的需求。(并且您提供的有关您的问题的更多信息表明它不是。请参阅下面的替代方案。)
这不包括名称以.. 但是,如果你有CR2文件的名字开始与一个点,随后大部分时间,你可能不希望在肖特韦尔打开他们无论如何。除非您故意以这种方式命名文件或文件夹,否则带有图像或文档文件扩展名的点文件更有可能是元数据文件,而不是实际的图像或文档。例如,macOS在访问外部媒体(包括闪存驱动器和数码相机)时通常会添加此类文件(例如,._kittens.cr2用于实际图片kittens.cr2)。
如果您确实还想查找名称以 开头的文件.或位于名称以 开头的文件夹中的文件.,请同时启用 dotglob。您可以使用shopt -s dotglob或通过将globstar和传递dotglob给shopt内置函数来执行此操作:
shopt -s globstar dotglob
Run Code Online (Sandbox Code Playgroud)
默认情况下,glob 区分大小写。但是,您可能希望以不区分大小写的匹配文件名,这样才能在截至打开的文件.cr2,.Cr2,.cR2,和.CR2。要做到这一点,要么:
通过运行shopt -swith 来启用 nocaseglob nocaseglob,可以单独运行,也可以与其他 shell 选项一起运行。例如,要shotwell在所有.cr2文件上运行,不区分大小写搜索并包括.-files 和.-directories 中的文件:
shopt -s globstar dotglob nocaseglob
shotwell **/*.cr2
Run Code Online (Sandbox Code Playgroud)或者,在您的 glob 模式本身中使用.[cC][rR]2而不是.cr2。例如,这完成了与上面相同的操作:
shopt -s globstar dotglob
shotwell **/*.[cC][rR]2
Run Code Online (Sandbox Code Playgroud)
请注意,区分大小写与.文件和文件夹是否匹配完全分开。您可以dotglob从上面的示例中删除,它们仍然可以不区分大小写。
要指定目录而不是仅使用当前目录,请将其名称和 a/放在**/*.cr2glob之前。例如,用这个替换shotwell上面的命令将打开主目录子目录中的所有.cr2文件Pictures:
shotwell ~/Pictures/**/*.cr2
Run Code Online (Sandbox Code Playgroud)
与使用当前目录的第一个命令不同,无论您在哪里运行该命令,您都会告诉 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
Run Code Online (Sandbox Code Playgroud)
globstar shell 选项已启用,这就是shopt -s globstar命令(上面)所做的。如果它已经启用,那么您不需要多个命令。并且您只需要为每个 shell 实例设置 globstar 一次。
您可以通过运行以下命令关闭 globstar:
shopt -u globstar
Run Code Online (Sandbox Code Playgroud)
您可以通过运行来检查globstar 是打开还是关闭:
shopt globstar
Run Code Online (Sandbox Code Playgroud)
如果您在脚本中使用 globstar,则如果可能在同一脚本中之后出现的代码不是使用 globstar 编写的,则您应该考虑将其关闭。例如,当 globstar 被禁用**时,按你的意思写*通常没有问题,但是当 globstar 被打开时,它可能会导致严重的问题,因为使命令影响的文件比某人预期的要多得多。
同样,如果您使用 dotglob 或 nocaseglob 并且您也想关闭它们,则可以分别使用shopt -u dotglob和 来shopt -u nocaseglob完成。您还可以传递多个 shell 选项以shopt -u同时取消设置它们。例如,要关闭globstar, dotglob, 和nocaseglob:
shopt -u globstar dotglob nocaseglob
Run Code Online (Sandbox Code Playgroud)
与 globstar 相比,由于忘记打开 dotglob 或 nocaseglob 而可能犯的严重错误更少。但是其他人(包括您在 Ask Ubuntu 等网站上咨询的人)通常会假设 dotglob 和 nocaseglob 在建议您使用的命令时被禁用,除非您另有说明。
有关这些与 glob 相关的 shell 选项(以及一般的 globs)的更多信息,请参阅bash 参考手册。它们都主要在4.3.2 The Shopt Builtin 中介绍。对于 globstar,另见3.5.8.1 模式匹配。对于 dotglob,另请参见3.5.8 文件名扩展。
由于在您的情况下,您似乎确实需要 Shotwell仅 显示.cr2文件,因此您.cr2在与.cr2文件相同的文件夹中有非文件,并且 Shotwell 中的图像浏览也会自动提供这些文件,因此您似乎需要一个文件夹除了.cr2您尝试打开的文件之外,不包含其他图像文件。
正如您所建议的那样,移动文件是一种方法,但我建议您要么复制文件,要么更好地制作文件的符号链接(另请参阅FOLDOC),因为:
您还需要做出另一个决定。您是否在同一目录中创建所有新条目(无论是副本还是符号链接),从而使文件层次结构变平?或者您是否在与源中包含至少一个.cr2文件的每个目录相对应的目标上创建目录?
通过扁平化文件层次结构,您可以轻松地同时查看所有文件。特别是,可以轻松地一次性查看所有文件的名称和大小,以及在图形文件浏览器中选择文件的任意组合。
但它也会丢失有关它们所在文件夹的信息,这可能很有价值(尽管如果不移动文件,您可以返回原始文件夹并在那里查找它们)。
但是,扁平化文件层次结构的更大问题是,如果在不同位置有两个或多个同名文件会发生什么。如果您将文件层次结构展平,那么根据您的操作方式,除了第一个副本之外的所有副本都将无法复制(或链接)并且您将收到错误或警告,或者除了最后一个副本(或链接)之外的所有副本都将失败被覆盖。
这是我建议复制或制作符号链接而不是移动文件的另一个原因。如果您“成功”地将多个文件移动到同一个文件中,那么除了最后一个之外,您已经丢失了所有文件!
由于将所有内容平铺到没有子目录的单个目录中的缺点,我在这里采用的方法在目标位置构建了一个新的目录树。
我首先展示它是因为它更简单一些,但我建议您改为创建符号链接(“方式 2”),特别是如果目标驱动器可能没有足够的空间来保存所有文件。“方式 2”有点复杂,但更详细,因为关于如何使用该技术的资源似乎较少,我希望大多数人在这种情况下会喜欢这种方式,并且信息适用于这两种方法-- 有关在路径中转义空格的基本建议 -- 在此处而不是此处给出。
当您需要复制目录树,并且需要自定义复制操作时,通常应该使用rsync代替cp。这是其中一种情况。
替换src为包含所有 CR2 文件的顶级目录的路径,并替换dest为您要创建的目录的名称,该目录将包含指向 CR2 文件的符号链接层次结构,运行:
shopt -s globstar dotglob
Run Code Online (Sandbox Code Playgroud)
不要忘记/源目录名称之后的 ,除非您想在dest. 也就是说,如果您省略尾随/,则将rsync为您创建目标目录,在dest. 例如,假设src是一个包含 no 的相对路径/。然后:
src/在你的rsync命令,你会得到一个符号链接dest/foo/bar.cr2的文件src/foo/bar.cr2。src在你的rsync命令,你会得到一个符号链接的文件。dest/src/foo/bar.cr2src/foo/bar.cr2由于将放置符号链接的顶级目录与包含.cr2符号链接将指向的文件的顶级目录具有相同的名称可能会令人困惑,因此我建议您/在目标的末尾包含rsync命令中的目录名称。(并且,对于源目录,为其指定一个空目录、不存在的目录或专用于此目的的目录。否则,您会弄乱其他一些文件夹。)
由于一般情况下,当你通过一个文件或目录的命令行程序或脚本的名称,如果你的目标或源目录路径包含由外壳,好像经过特殊处理的任何空格(或字符\,$,'和各种其他标点符号),那么您将不得不引用它们。对于最常见的空格情况,我已经在“方式 2”中详细说明了如何执行此操作——该部分中有关引用的建议也适用于此处。但是,如果您不确定如何引用文件夹的名称,您可以让 Ubuntu 为您完成,只需将文件夹拖到终端中即可;它的完整路径将粘贴在正确的引用中。
仅复制.cr2文件和包含它们的文件夹后,您可以在 Shotwell 中打开目标文件夹。(请参阅上面的“在 Shotwell 中打开图像文件夹(包括子文件夹)”。)但是,在运行 之前rsync,我建议您决定是否要跳过以 开头的条目.以及是否要包含具有大小写变体后缀的条目。如果是这样,您将不得不运行一些稍微不同的rsync命令。
您可能希望使用不同的rsync命令来更改是否跳过以点开头的文件和目录,以及是否希望在匹配后缀时区分大小写.cr2。
上面的命令确实包含名称以.. 要排除此类文件和目录,请将其放在--exclude='.*/' --exclude='.*'所有其他--includes 和--excludes 之前。也就是说,改用这个rsync命令(当然,对srcand进行适当的替换dest):
shopt -s globstar dotglob nocaseglob
shotwell **/*.cr2
Run Code Online (Sandbox Code Playgroud)
该rsync显示的命令迄今已区分大小写的,并不会复制文件结束.CR2,.Cr2或者.cR2不是.cr2。如果您希望复制此类文件,则需要使用--include模式*.[cC][rR]2代替*.cr2.
这第三个命令是不区分大小写和(如第一个命令)并不能跳过的文件和目录的名字开始.:
shopt -s globstar dotglob
shotwell **/*.[cC][rR]2
Run Code Online (Sandbox Code Playgroud)
如果您采用使用 复制文件的方法rsync,并且不确定您需要这些命令中的哪一个,如果您想确保不会遗漏任何内容,我建议使用该命令。但是,您应该意识到点文件可能包含元数据,并且以图像命名的点文件可能并不是真正的图像。请参阅上面“使用图像文件名列表启动 Shotwell”部分中有关点文件的讨论,以及下面“方式 2”中有关点文件和区分大小写的讨论。
第四个命令不区分大小写,并且(与第二个命令一样)会跳过名称以.以下开头的文件和目录:
shotwell ~/Pictures/**/*.cr2
Run Code Online (Sandbox Code Playgroud)
这是我建议您执行的操作,但如果目标驱动器上有足够的空间,方法 1 也可以。您不必阅读方式 1 即可使用它。
此处介绍的方法生成.cr2文件列表并循环遍历列表,根据需要创建目标目录并使用指向每个.cr2文件的符号链接填充它们。
这只是足够复杂,我建议将其放入脚本中,而不是仅以交互方式输入。您可以将脚本放在任何您喜欢的位置,但为了方便起见,我将展示如何将脚本直接放在您的主文件夹中。
make-symlinks在您的主文件夹中创建一个文本文件。不需要文件扩展名。
您可以使用任何文本编辑器(如 Vim、Nano、Gedit 或 Leafpad)执行此操作。不过,不要使用像 LibreOffice Writer 这样的文字处理器。(如果需要,您甚至可以通过运行cat > ~/make-symlinks、粘贴文件内容并在新行上按Ctrl+D来实现。)
如果您将脚本命名为 以外的其他make-symlinks名称,请确保在稍后运行使用该脚本的命令时使用该名称。
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
Run Code Online (Sandbox Code Playgroud)
把它放在文件中,然后保存文件。此脚本使用 globstar,这是上文“使用图像文件名列表启动 Shotwell”中解释的 Bash 功能。
根据您的需要,您可能需要进行一些更改:
如果不想包含.cr2名称以 开头的文件.或驻留在名称以 开头的目录中的文件.,请dotglob从该shopt行中删除。
名称以 开头的文件和目录.通常用于元数据(请参阅上面的“使用图像文件名列表启动 Shotwell”部分)。另一方面,如果你想确保你拥有一切,或者如果你非常确定有一些莫名其妙的缺失,那么应该保留dotglob.
如果你想只包括文件正是为此.cr2而不是变体情况下(.CR2,.Cr2,和.cR2),那么你就应该删除nocaseglob。由于您的情况涉及数据恢复,而Shotwell 不会向您显示打开符号链接目录时遗漏的任何文件——毕竟,这就是此方法的重点——您可能希望保留nocaseglob.
运行此命令以标记您的脚本可执行文件:
chmod +x ~/make-symlinks
Run Code Online (Sandbox Code Playgroud)
然后将目录更改为源目录,即包含图片的顶级文件夹。例如,如果它们在Pictures您的主目录的子目录中,您将运行:
cd ~/Pictures
Run Code Online (Sandbox Code Playgroud)
这是您运行脚本的地方。将目标目录作为命令行参数传递给脚本。
例如,如果您希望cr2s在桌面上创建一个名为的目录来包含符号链接,请运行:
~/make-symlinks ~/Desktop/cr2s
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想将该目录直接放在您的主文件夹中:
~/make-symlinks ~/cr2s
Run Code Online (Sandbox Code Playgroud)
或者,如果您安装了一个驱动器,/media/you/MyDrive并且您想在其上创建一个文件夹,称为links包含符号链接:
~/make-symlinks /media/you/MyDrive/links
Run Code Online (Sandbox Code Playgroud)
但是如果驱动器是/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
Run Code Online (Sandbox Code Playgroud)
但是,如果您~用于主目录,请不要引用:
~/make-symlinks ~/'Two Words' # good
~/make-symlinks ~/Two\ Words # good
~/make-symlinks '~/Two Words' # BAD, because ~ doesn't get expanded
Run Code Online (Sandbox Code Playgroud)
make-symlinks如果目标目录尚不存在,则为您创建目标目录,就像在其中创建子目录一样。但是,如果目的地已经存在,它仍然有效。
您甚至可以多次运行它并传递相同的目标目录(例如,如果您用Ctrl+中断它C),尽管您会收到failed to create symbolic link已经存在的符号链接的错误,这可能会令人困惑。
您可能不想将已存在且包含不相关文件(如您的主目录)的目录的名称传递给make-symlinks. 如果这样做,您可以期望在其中创建一大堆符号链接和子文件夹。您可能想要使用一个新目录——或者一个尚不存在的目录——用于make-symlinks.
运行后make-symlinks,只需使用本答案第一部分中给出的任一方法(“在 Shotwell 中打开图像文件夹(包括子文件夹)”)将传递给它的目录导入Shotwell。例如,您可以打开 Shotwell 并将文件夹拖入其中。
由于文件夹中的所有条目都是指向.cr2文件或包含它们的目录的符号链接,没有其他文件类型,因此 Shotwell 不应看到任何其他文件。
Shotwell 将循环浏览在图像打开的每个目录中找到的所有图像,因此find -name '*.cr2' -exec shotwell '{}' +按照我最初的建议使用并没有真正的帮助。由于 Shotwell 的设置相当有限,我能想到的仅打开您想要的文件的唯一方法是将文件自己移动到新目录。
你可以使用find:
mkdir ~/cr2files
find -type f -iname '*.cr2' -not -path './dir/*' -exec cp -v -- '{}' ~/cr2files \;
Run Code Online (Sandbox Code Playgroud)
更换cp用mv,如果你想避免创建重复文件。
mkdir ~/cr2files 在您的主目录中创建一个新目录find 从当前目录向下递归搜索树-type f 只搜索文件-iname 按名称搜索文件,忽略大小写'*.cr2'以.cr2-结尾的名称在传递给 glob 之前使用引号阻止 shell 扩展 globfind-not -path './dir/*'将排除目录的内容dir从结果{} 表示找到的文件的路径--aftercp是告诉cp不要接受任何进一步的选项,这避免了任何以-引起问题开头的文件名然后,您可以使用 Shotwell 打开新目录中的任何文件并循环浏览它们
xargs选项 1 -当文件名包含空格时使用正如下面的评论所指出的,back ticks当文件名包含空格时,使用(下面的选项 3)将会中断。find使用命令并将输出传递给shotwell使用选项的更安全方法xargs如下所示:
find . -name "*.cr2" -print0 | xargs -0 shotwell
Run Code Online (Sandbox Code Playgroud)
该-print0标志告诉 find 在文件名之间使用\0(空字符)分隔符,并且该-0标志告诉xargs我们期待这些\0分隔符。
感谢此处在 Stack Overflow 上找到的出色答案(How to pipeline list of files returned by find command)。
-exec选项 2 -当文件名包含空格时使用正如下面的评论指出的,该-exec选项还支持包含空格的文件名。下面的其他评论指出,当文件数量超过时,就会中断。这看起来像这样:
find . -name "*.cr2" -exec shotwell {} +
Run Code Online (Sandbox Code Playgroud)
过去,在文件名包含空格且长度变为 256 个字符之前,此选项运行良好。您会发现许多其他网站上提到了此选项,但您不应该使用此选项。过去,使用find命令并将输出传递给shotwell是最简单的方法:
shotwell `find . -name "*.cr2"`
Run Code Online (Sandbox Code Playgroud)
这find从当前目录开始并包括所有子目录:
$(...)bash 中。.给出find一个起点,即当前目录。你可以通过/home/$USER/Pictures或其他东西来代替.。-name告诉 find 搜索文件名(而不是目录)。shotwell. ie 您可以将它用于cat、head和tail大多数其他流行的 Linux 命令。| 归档时间: |
|
| 查看次数: |
2424 次 |
| 最近记录: |