问题已回答here OP的喜好,但我不能让它100%为我工作。我想要做的是在/home/hermit/Documents/Pictures
中获取文件并在将新文件放入/home/hermit/Documents/HashPictures
之前对其进行哈希处理,同时将文件保留在/home/hermit/Documents/
中。不幸的是,解决方案 似乎不适用于GIF和JPG。
或者GNU sed可以做得更短:
# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e'
另一件很好的事情是,如果我可以使用易于阅读的脚本或者附带脚本的解释。
编辑:这些是剩下的文件(/home/hermit/Documents/Pictures
和终端输出。剩余文件:File names inside
hermit@hermit:~/Documents/PicturesHashed$ ./hash.sh
mv: target '9c48b6846aa3211ba867d9775aa9a730.jpg' is not a directory
mv: target '6cef7445eb7382aa719e364dc2d0126c.jpg' is not a directory
mv: target 'b3624eae0010f7d042af838859d5ea0e.png' is not a directory
mv: target '12f8f700cc73abe05da61103184f2ed0.jpg' is not a directory
mv: target '340e018ba57016f469a1039fb19c2619.jpg' is not a directory
mv: target '89da545ea3084500cd86a6265676173c.jpg' is not a directory
mv: target '7ff0671fc0447ca009d216670a0e2ac9.gif' is not a directory
mv: target '300d7e1e9807701f1a5043de85992484.jpg' is not a directory
mv: target 'c340521eec897957c0a7d6f415232ae4.png' is not a directory
mv: target '263ef6fd0b8623227a705bbcecb61755.gif' is not a directory
mv: target '2f4e522461ff467d5b4a09b7d33c2114.jpg' is not a directory
mv: target '2372edeb385381540d2230266ad5a4d2.png' is not a directory
mv: target 'bf5fc13be51d281347e0b00694c7689b.jpg' is not a directory
mv: target '3ab04030a8d06ff5aa5dca406c3927b0.jpg' is not a directory
mv: target '84d61abe2ff50e81d96e9b5ca916048e.jpg' is not a directory
mv: target 'c1c74496d880e4a20403c65e583dff54.jpg' is not a directory
mv: target '99c2a10e1f4ce27a08eafb70cbac09c1.jpg' is not a directory
mv: target '7ff0671fc0447ca009d216670a0e2ac9.gif' is not a directory
mv: target 'e27c3fe527a6417e13f2b55865b77d4f.jpg' is not a directory
mv: target 'd32b6aa0ff3929b477fe5e33872220d1.png' is not a directory
mv: target '70df8a56449a7b19b286e0b77394a7c8.jpg' is not a directory
mv: target '7e9b7446ea3fe662fa7ba3ba45952cbf.jpg' is not a directory
mv: target '975de97e64c345cbe41532101636c70e.gif' is not a directory
mv: target 'c3a691daa3400f00c87de37703ddd222.jpg' is not a directory
sh: 1: Syntax error: "(" unexpected
sh: 1: Syntax error: "(" unexpected
mv: target 'ce14ef4371c5fe6a61a539a9f22e6227.jpg' is not a directory
答案 0 :(得分:1)
我觉得这更容易阅读和遵循:
#!/bin/bash
source_dir=/home/hermit/Documents/Pictures
destination_dir=/home/hermit/Documents/HashPictures
for file in "${source_dir}"/*;do
hash=$(md5sum "${file}"|cut -d' ' -f1)
ext=${file##*.}
cp -v "$file" "${destination_dir}/${hash}.${ext}"
done
答案 1 :(得分:1)
A部分 - 您所看到的
或者GNU sed可以做得更短:
# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e'
我个人讨厌使用sed
来处理这些案件,如果我在专业代码中对此进行审查会拒绝它,因为对于未来的读者来说,这是非常难以理解的。
Sed是一个流编辑器。你把东西送进去编辑它然后推出结果。它使用regular expressions来匹配输入上的模式,然后对它们执行某些操作。即使您已经与他们合作了一段时间,正则表达式也很难阅读,因此我不希望很多人能够阅读上述代码。人们倾向于使用它,因为它可以用很少的代码做很多事情。
Sed有许多派对技巧,在这种情况下,它用于执行其他命令(mv
)。
md5sum *
正在产生这样的输出:
263620ac1a08b934b5312f416fe7a1af IMAG0001.jpg
972eddbf8e368a9c3d38e66bcf924cbc IMAG0002.jpg
94b30dfedb8afb7143268d1c329d7e64 IMAG0004.jpg
c592b83172e7f3c2d20207ee4e0cdd0d IMAG0005.jpg
1bc861c1251d87aea5e98ff263e09e79 IMAG0223.jpg
560afa8d60ff833a9dee52eff2fc420b IMAG0224.jpg
然后,Sed将其编辑为:
mv -v IMAG0001.jpg 263620ac1a08b934b5312f416fe7a1af.jpg
mv -v IMAG0002.jpg 972eddbf8e368a9c3d38e66bcf924cbc.jpg
mv -v IMAG0004.jpg 94b30dfedb8afb7143268d1c329d7e64.jpg
mv -v IMAG0005.jpg c592b83172e7f3c2d20207ee4e0cdd0d.jpg
mv -v IMAG0223.jpg 1bc861c1251d87aea5e98ff263e09e79.jpg
mv -v IMAG0224.jpg 560afa8d60ff833a9dee52eff2fc420b.jpg
然后Sed执行此代码。
现在您明白了,您很可能会选择mv -v
并将其换成cp
或其他命令。但是你仍然会遇到空格和特殊字符的问题。
B部分 - 更强大的解决方案
我会完全避免sed
。如果你不理解它,那么就不要使用它。大多数人都不理解。
for file in *.jpg
do
sum=`md5sum "$file"`
#remove the file name from md5sum's output
# this is using bash's pattern matching but can be swapped out
sum="${sum% $file}"
cp "$file" "HashPictures/$sum"
done
请注意,我在$file
和$sum
都有引号。我们还处理每个命令一个文件,而不是每个文件都有一个命令。这样,文件名中的空格永远不会与用于拆分命令参数的空格混淆。
C部分 - 最后的想法
对于此示例代码,我使用cp
将图像的副本放在新目录中。那可能不是你想要的。例如,使用ln -s "$file" "HashPictures/$sum"
创建symbolic link。这样可以避免复制文件并节省大量空间。
答案 2 :(得分:0)
Perl救援:
#!/usr/bin/perl
use warnings;
use strict;
use Digest::MD5 qw{ md5_hex };
my ($source, $target) = @ARGV;
$source =~ s/(\s)/\\$1/g;
for my $file (glob "$source/*") {
open my $fh, '<', $file or die "$file: $!";
my $content = do { local $/; <$fh> };
my $digest = md5_hex($content);
my ($extension) = $file =~ /\.([^.]*)/;
open my $out, '>', "$target/$digest.$extension" or die "$file: $!";
print {$out} $content;
close $out;
}
以
运行perl script-name -- "source-dir" "target-dir"
答案 3 :(得分:0)
这是一个Python解决方案。将它放在要转换的同一目录中的Python文件中(或修改 <%= form_tag( '/welcome/index', post: true, remote: true) do %>
<h5 class="label">Estimated new home cost?</h5>
<%= text_field_tag :price, nil, placeholder: "ex. 100,000", class: "form-control form-control-lg", id: 'price' %>
<h5 class="label">Estimated payment for a new home?</h5>
<%= text_field_tag :mortgage, nil, placeholder: "ex. 1,200", class: "form-control form-control-lg", id: 'mortgage' %>
<h5 class="label">Current Monthly Rent?</h5>
<%= text_field_tag :rent, nil, placeholder: "ex. 800", class: "form-control form-control-lg", id: 'rent' %>
<button type="button" class="btn btn-success btn-lg" data-toggle="modal" data-target="#savingsModal">
See how quickly you can buy a home
</button>
)。
'.'
答案 4 :(得分:0)
将当前目录中所有非目录的文件重命名为
md5sum * | awk '{print "mv", $2, $1 ".jpg" }' | bash
或
md5sum -- * | awk '{print "mv --", $2, $1 ".jpg" }' | bash
如果文件以减号开头。