
У меня есть большое количество электронных книг, которые очень неорганизованы. Некоторые из них находятся в своих собственных каталогах, некоторые из них повреждены, некоторые из каталогов пусты. Как мне собрать мои электронные книги из всех этих разных каталогов и поместить их все в одну папку, чтобы я мог читать и реорганизовывать их? Я бы предпочел использовать собственные команды GNU или скрипт bash.
решение1
Я предполагаю, что у вас, по крайней мере, все они находятся в различных подкаталогах в одной родительской папке. Что-то вроде ~/mybooks
. Если так, то вы можете сделать это:
find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
Это найдет все файлы или каталоги, чьи имена заканчиваются на .pdf
или .epub
в каталоге ~/mybooks
и переместит их в каталог ~/newdir
. Если у вас могут быть каталоги, чьи имена заканчиваются на .pdf
или .epub
, добавьте -type f
директиву, чтобы получить только файлы:
find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
решение2
Чтобы переместить все файлы с определенными расширениями в дереве каталогов (т. е. в каталоге и его подкаталогах рекурсивно) в один каталог, в zsh:
mv -i source/**/*.(pdf|epub) destination/
Каталог destination
должен уже существовать. Вы можете опустить source/
часть, если хотите собрать файлы в текущем каталоге и его подкаталогах. Если вы хотите переместить все файлы независимо от их имени, но не каталоги:
mv -i source/**/*(.) destination/
В Баше:
shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/
Эти команды могут жаловаться, что командная строка слишком длинная, если у вас много файлов. В этом случае вы можете вызвать find
вместо использования рекурсивного подстановки.
find source -name '*.pdf' -o -name '*.epub' -exec mv -i -t destination/ {} +
find source -type f -exec mv -i -t destination/ {} +
Если существующая структура каталогов несет какую-то информацию, то вместо перемещения файлов вам может быть удобнее создатьжесткие ссылкиилисимволические ссылки.
Чтобы создать жесткие ссылки, вызовите ln
вместо mv -i
. С жесткими ссылками каждый файл будет присутствовать в обоих местах одновременно. Если вы удалите либо исходный, либо новый файл, другой останется: два местоположения файла будут на равных основаниях. Вы можете сказать, что файл имеет жесткие ссылки, потому что число во втором столбце в выводе ls -l
больше 1.
Чтобы создать символические ссылки, сначала перейдите в целевой каталог и вызовите ln -s
using .
(обозначающий текущий каталог) в качестве цели. Символическая ссылка — это файл, который просто говорит «посмотрите на этот файл там вместо этого». Если вы удалите символическую ссылку, это не повлияет на исходный файл. Если вы переместите или удалите исходный файл, символическая ссылка станет висячей (т. е. она все еще там, но больше не указывает на файл).
Чтобы удалить пустые каталоги в каталоге, вы можете использовать
find /some/directory -depth -type d -empty -delete