gpt4 book ai didi

macos - 我怎样才能只移动 list.txt 中*不*的文件?

转载 作者:行者123 更新时间:2023-11-29 09:27:46 25 4
gpt4 key购买 nike

我有一个 .jpg 文件的文件名列表。我想将所有图像移出给定的文件树,列表中的图像除外。我一直在尝试使用查找循环来执行此操作,但效果不佳:

x=$(find . -type f -not -name "$line")
while IFS= read -r line ; do
mv "$x" Destination/
done < Filenames.txt

摘自 Filenames.txt:

IMG_5253 (2).jpg
IMG_5255 (2).jpg
IMG_5256 (2).jpg
IMG_3988.JPG
IMG_3989.JPG
IMG_3990.JPG

我想我明白为什么这是有问题的(我真的不想要一个循环,确切地说),但我不知道如何修复它。执行此操作的好方法是什么?

编辑:在@ghoti 和这个线程的帮助下,Rsync 为我工作:https://unix.stackexchange.com/questions/76237/rsync-certain-files-excluding-the-rest-ignoring-svn-directory-recursively

rsync -rv --exclude-from '/Path/To/Filename.txt' --exclude='*Pattern/For/Other/Files/That/Should/Stay/Put*' --include='*.jpg' --include='*.JPG' --include='*/' --exclude="*" --remove-source-files Path/To/Source Path/To/Destination

我也非常幸运地使用了下面发布的 Perl 解决方案,与其他一些选项相比,它运行得非常快。我将 rsync 标记为我的解决方案,因为这是我使用的,但后来的其他人可能也想看看@Tom_Fenench 的解决方案。

最佳答案

这不是很快,但应该可以。

find /startpath  -name \*.jpg -not -exec grep -q '^{}$' filenames.txt \; -exec mv -v {} /target/path/

这将从 /startpath 开始,然后遍历所有子目录以查找以 .jpg 结尾的文件。对于其中的每一个,它都会对您的文件运行 grep,如果该 grep -not 成功,则会在一秒钟内移动时打印文件名 -执行

请注意,由于 find 匹配内容的方式,您可能需要在文件名前加上路径,即使这些路径是 ./

另请注意,这不是一个速度或 IO 优化的解决方案,因为它会为它找到的每个文件启动一个单独的 grep 命令。

或者,如果你想使用 rsync,你可以这样做:

rsync -a -v --exclude-from=/path/to/list.txt --remove-source-files /sourcedir/ /targetdir/

关于macos - 我怎样才能只移动 list.txt 中*不*的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32954311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com