Я пользователь Linux. Я случайно загрузил кучу файлов в неправильный каталог. Теперь они смешаны с моими другими файлами. Затем я создал новый подкаталог и снова загрузил все файлы, на этот раз в подкаталог. Каков наилучший способ удалить все файлы, которые я случайно загрузил в каталог, без случайного удаления любых моих существующих файлов. Я новичок в Linux и мне нужна помощь. Я полагаю, что это может быть устаревшей датой, или это можно сделать, сказав для каждого файла в подкаталоге, удалить файл в каталоге с тем же именем. Заранее спасибо! - Ларри
5 ответов
Если время изменения файла совпадает, то вы можете использовать вариант на touch
и find
чтобы найти файлы, которые будут удалены. Предположим, вы загрузили файлы сразу после 12:34 сегодня (2009-09-08):
touch 20090908123400 empty.file
find . -newer empty.file -print
Это перечислит файлы. Когда вы уверены, что у вас есть нужные файлы, вы можете изменить команду find
на:
find . -newer empty.file -print0 | xargs -0 rm -f
Использование параметров ' -print0
' и ' -0
' означает, что конвейер будет правильно обрабатывать имена файлов с пробелами и всеми другими специальными символами. Вы также можете использовать -older
и второй пустой файл с другой отметкой времени для кадрирования времени.
Если при загрузке сохраняются времена изменения файлов в удаленной системе, вы, вероятно, скрыты. Однако это вряд ли будет проблемой.
На самом деле это очень легко сделать.
cd
в каталог, в который вы случайно загрузили файлы, и запустите следующий код, заменив подкаталог именем подкаталога, содержащего файлы, которые вы скачали во второй раз.
rm `ls subdirectory`
То, что это делает, перечисляет все содержимое в subdirectory
и этот список передается в rm
который R e M перемещает любые файлы с тем же именем в текущем каталоге.
Чтобы расширить концептуально правильное решение Pynt, вы можете обрабатывать файлы с пробелами в их именах, используя параметры нулевого разделителя для find и xargs:
Предположим, что ваша папка для скачивания - ~/Downloads/
, которая содержит файлы file 4
и file 5
. Вы действительно хотели загрузить набор файлов (file 1
, file 2
и file 3
) в подкаталог ~/Downloads/subdir/
. Вы случайно загрузили эти файлы в ~/Downloads/, а затем правильно загрузили их в ~/Downloads/subdir/. Итак, ваша текущая ситуация выглядит так:
$ tree ~/Downloads/
.
|-- file 1
|-- file 2
|-- file 3
|-- file 4
|-- file 5
`-- subdir
|-- file 1
|-- file 2
`-- file 3
Чтобы удалить нужные файлы, попробуйте это:
$ cd ~/Downloads
$ { pushd subdir; find -mindepth 1 -maxdepth 1 -print0; popd; } |\
xargs --null -I'{}' trash '"{}"
Этот код не удалит файлы. Вместо этого он отправит их в корзину, если вы установили пакет trash-cli. (Видите, отменить rm Linux? для получения дополнительной информации о команде мусора, которую я настоятельно рекомендую.) Если вы предпочитаете жить опасно, замените trash
на rm
. Если вы хотите жить еще менее опасно, замените trash
echo trash
. Это просто напечатает команды, которые будут удалять ваши файлы.
В любом случае, вот объяснение, так как вы никогда не должны доверять коду, который вы не понимаете. Первая строка просто перемещается в каталог Downloads. Вторая строка находит и печатает имена всех файлов в subdir
. pushd
и popd
похожи на cd
, только с кнопкой возврата. (Посмотрите на стеки, если вам интересно, откуда взялись "push" и "pop".) Опции для find
указывают на то, что список должен быть только в subdir
а не, например, в subdir/another subdir/third subdir
. Они также говорят это не перечислять .
имя текущего каталога. Вы не хотите удалить это. Наконец, опция -print0
указывает find
распечатать найденные файлы, но разделить их пустыми символами вместо пробелов. Вот как мы имеем дело с пробелами.
Аналогично, в третьей строке параметр --null
для xargs
указывает ему читать имена файлов из find
с нулевыми символами, разделяющими их. Оставшаяся третья строка создает команду, которая удалит ваши файлы.
В целом урок заключается в том, что вам нужно обрабатывать файлы, которые могут иметь пробелы, обычно вам нужно использовать команду, которая включает find -print0 | xargs --null
.
Простое решение для bash
cd subdir
for i in *
do
rm "../$i"
done
Я не проверял это, поэтому вам лучше протестировать его, прежде чем запускать его по-настоящему :)
Pynt и Peltier имеют эту основную идею, но только Peltier будет обрабатывать файлы с пробелами.
Это должно работать:
cd path-to-subdirectory
set -- *
cd -
ls -ld "$@" | more # Make sure the list is what you expect to remove, then:
rm -rf "$@"
Я показываю использование "ls" для подтверждения списка файлов перед удалением, для здравого смысла.
Но вы также можете переместить их во временное хранилище (включая ZIP-архив), если вас беспокоит удаление не того материала. Просто замените "rm" выше одним из следующих, затем, если вы доверяете тому, что произошло, удалите ZIP или временный каталог:
mkdir /tmp/to-nuke ; mv -vi "$@" /tmp/to-nuke
zip -0rm backup.zip "$@"