Я сделаю следующие предположения:
1) все имена файлов уникальны
2) Вы хотите только проверить отсутствующие файлы ( нет, если файлы имеют одинаковую сумму md5 на каждом устройстве, т.е. если картинка повреждена)
3) Файлы могут отсутствовать только на машине, на SD-карте по умолчанию есть все файлы.
Кроме предположения 1, script можно изменить, чтобы найти отдельные файлы в любом месте или даже выполнить перекрестную проверку md5 для каждой пары файлов.
Таким образом, мы можем использовать find
, выбрать все имена файлов и проверить списки на наличие uniq
имен файлов ue
#!/bin/bash
#load all file names from local dir as array:
pics_local=( $( find /path/to/dir/ -type f -printf "%f\n" ) )
#load all file names from SD card as array:
pics_SD=( $( find /mnt/SD/ -type f -printf "%f\n" ) )
#see if files are only in one of them,
#i.e. if file names appear only once (save as array):
singulars=( $( printf "%s\n" ${pics_local[@]} ${pics_SD[@]} |\
sort | uniq -u ) )
#print list of missing files with full paths using find:
for (( i=0 ; i<=${#singulars[@]}-1 ; i++ )) ; do
find /mnt/SD/ -type f -name "${singulars[$i]}"
done
ОБНОВЛЕНИЕ: скрипт с md5sum для каждый файл: у нас есть все файлы на SD, и мы ищем недостающие в локальном каталоге. Все локальные файлы идентичны файлам SD (нет соответствующих файлов с несовпадением сумм md5)
#!/bin/bash
#load file names and md5sums of files on SD card into array
files_SD=( $( find /mnt/SD/ -type f ) )
md5_SD=( $( find /mnt/SD/ -type f -exec md5sum {} + | cut -d' ' -f1 ) )
#load md5sums of files in local folder into array:
md5_loc=( $( find /local/dir/ -type f -exec md5sum {} + | cut -d' ' -f1 ) )
#check for the very unlikely possibility of md5sums
#matching for more than two files
#IMHO: can be safely skipped
if [[ $(sort <( printf '%s\n' ${md5_loc[@]} ${md5_SD[@]}) |\
uniq -c | awk ' $1 >= 3 ' ) ]] ; then
echo "md5 sums matching for more than 2 files!"
echo "critical error, aborting"
exit
fi
singular_md5s=( $( printf '%s\n' ${md5_loc[@]} ${md5_SD[@]} | sort | uniq -u ) )
for (( i=0 ; i<=${#singular_md5[@]}-1 ; i++ )) ; do
#assume SD card has all files
#print file that is missing in local folder:
#1) find where it is in the array:
n=$(( $(grep -n "${singular_md5s[$i]}" <( printf '%s\n' ${md5_SD[@]} ) | cut -d: -f1 )-1 ))
#2) print file name
echo "${files_SD[$n]} missing on local folder"
done
Это зависит от вашей оболочки и активного режима редактирования командной строки.
Для оболочки с режимом редактирования командной строки Emacs(set -o emacs
в некоторых оболочках )используйте Alt+D(по какой-то причине это не работает в macOS, но печатает символ ∂
, используйте Escd вместо ).
Для оболочки с режимом редактирования командной строки Vi(set -o vi
в некоторых оболочках )используйте Escdw(это действительно работает и на macOS ).
В терминале Linux можно попробовать Ctrl + K для удаления от курсора до конца строки.
Есть несколько других ярлыков, таких как:
EOF
; как правило, выход из оболочки. В противном случае удалите символ после курсора. Для дисциплины tty line ^W
удаляет предыдущее белое -разделенное пробелом слово .
В редакторе vi
в режиме вставки ^W
удаляет назад к началу первой последовательности альнумов или не -альнумов (в foo-+-bar.. baz
, сначала удаляет baz
, затем ..
, затем bar
, затем -+-
, затем foo
).
В редакторе emacs
^W
удаляет из позиции курсора до метки (, которую вы установили с помощью Ctrl+Пробел).
Некоторые строковые редакторы, такие как readline
(, используемые bash
, gdb
... ), zle
(, используемые zsh
), pdksh
в режиме vi
, ведут себя как vi
в этом отношении и в режиме emacs
ведет себя как дисциплина линии tty (, а неemacs
).
libedit
(используется оболочками BSD или (опционально )dash
), tcsh
, AT&T ksh
, в режиме emacs
ведет себя как emacs
, где ^W
удаляется до метки (изначально в начале буфера ).
Для удаления слова вперед в редакторе vi
вы должны сделать это в команде(нормальном)режиме с dw
для удаления в начало следующей последовательности номеров или не -alnums (или конец строки )и dW
для удаления в следующую последовательность не -пробелов (подвеска ^W
дисциплины tty line ).
В строковом редакторе emacs
Meta -D будет удаляться до конца следующей последовательности символов alnum. Аналогично ведут себя операторы движения слов(Meta -B , Meta -F ).
в режиме vi
ведут себя как vi
, но в режиме emacs
у вас есть две основные школы :школа tcsh
и школа ksh
.
Школа ksh
(readline
, ksh
,yash
)ведет себя в основном так же, как поведениеemacs
(fish
немного отличается тем, как она относится к не -alnum,не -пробельные символы в режимах emacs
и vi
).
В школе tcsh
(tcsh
, libedit
,zsh
)движения слов основаны на словах, разделенных пробелами -, поэтому в этом отношении они соответствуют дисциплине tty line ^W
.
В zsh
поведение настраивается с различными стилями слов для всех виджетов движения слов.
Для readline
вы можете получить tcsh
школу (и Мета -D удалить такое же слово, как Ctrl -W делает ), добавляя к вашему~/.inputrc
:
set keymap vi-move
"\e[EMACS~": emacs-editing-mode
set keymap emacs
"\e[VI~": vi-movement-mode
"\ed": "\e[VI~dW\e[EMACS~"
"\ef": vi-fWord
"\eb": vi-bWord
Или, с другой стороны, выровняйте ^W
по другому слову виджеты движения (ведут себя как Meta -Backscape)с:
set keymap emacs
"\C-W": backward-kill-word
О том, что такое Мета-ключ , см. там .