1

Я пользователь Linux. Я случайно загрузил кучу файлов в неправильный каталог. Теперь они смешаны с моими другими файлами. Затем я создал новый подкаталог и снова загрузил все файлы, на этот раз в подкаталог. Каков наилучший способ удалить все файлы, которые я случайно загрузил в каталог, без случайного удаления любых моих существующих файлов. Я новичок в Linux и мне нужна помощь. Я полагаю, что это может быть устаревшей датой, или это можно сделать, сказав для каждого файла в подкаталоге, удалить файл в каталоге с тем же именем. Заранее спасибо! - Ларри

5 ответов5

3

Если время изменения файла совпадает, то вы можете использовать вариант на 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 и второй пустой файл с другой отметкой времени для кадрирования времени.

Если при загрузке сохраняются времена изменения файлов в удаленной системе, вы, вероятно, скрыты. Однако это вряд ли будет проблемой.

2

На самом деле это очень легко сделать. cd в каталог, в который вы случайно загрузили файлы, и запустите следующий код, заменив подкаталог именем подкаталога, содержащего файлы, которые вы скачали во второй раз.

rm `ls subdirectory`

То, что это делает, перечисляет все содержимое в subdirectory и этот список передается в rm который R e M перемещает любые файлы с тем же именем в текущем каталоге.

2

Чтобы расширить концептуально правильное решение 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 .

1

Простое решение для bash

cd subdir
for i in *
do
    rm "../$i"
done

Я не проверял это, поэтому вам лучше протестировать его, прежде чем запускать его по-настоящему :)

0

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 "$@"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .