У меня есть два каталога, которые называются thumb и thumb2. Они содержат одинаковые имена файлов, но различаются по размеру. К сожалению, в thumb2 есть файлы, которых нет в thumb2, и которые необходимо удалить.
$ ls ../thumb2 | wc -l
199030
$ ls ../thumb | wc -l
193455
Я ищу команду командной строки, которая удалит все файлы из thumb2, которых также нет.
Кто-нибудь знает, как это сделать?
Я протестировал это решение на небольшом образце, но обязательно сделайте резервную копию своих каталогов, прежде чем пытаться:
cd ../thumb2
for f in *; do test -e ../thumb/$f || echo rm $f; done
У меня нет каталога с тысячами файлов, поэтому я не знаю, работает ли эта команда для такой большой выборки. Пожалуйста, попробуйте его после того, как вы создали резервные копии своих каталогов. Убедившись, что команда работает правильно, удалите echo
команда.
Вот модифицированная версия отличного решения Гленна:
diff thumb thumb2 | \
while read field1 field2 dir filename; do
[[ $dir = "thumb2:" ]] && echo rm "thumb2/$filename"
done
Вы также можете позвонить diff
для проверки содержимого каталога:
diff thumb thumb2 |
while read line; do
case "$line" in
"Only in thumb2: "*) echo rm "thumb2/${line#*: }" ;;
esac
done
удалять echo
если вы довольны, он работает.