Как я удаляю файлы, загруженные на каталог, которые теперь смешаны в с другими файлами, не удаляя другой в Linux

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

1
задан 08.09.2009, 22:58

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

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

3
ответ дан 12.12.2019, 07:55
  • 1
    никакая потребность в-print0 | xargs..., который не работает, когда у Вас есть много файлов. Найдите имеет - удаляют флаг, который и корректен и быстр. – Peltier 09.09.2009, 02:40
  • 2
    POSIX find не имеет a -delete флаг, так, чтобы не было совершенно портативным - но затем это не имеет -print0 также, таким образом, вне "Я не знал -delete, и это была хорошая идея добавить его к find", нет намного больше для высказывания. – Jonathan Leffler 09.09.2009, 05:39

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

rm `ls subdirectory`

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

2
ответ дан 12.12.2019, 07:55
  • 1
    Не работает на файлы с пробелами на их имена. – Tim 08.09.2009, 23:21
  • 2
    я пытаюсь фиксирую это путем добавления некоторых опций к ls, но они не действуют как ожидалось. Надо надеяться, это не проблема для OP, так как наиболее загруженные файлы не являются пробелами в них. – Alvin Row 08.09.2009, 23:36
  • 3
    Если Вы удалять все в подкаталоге, то"rm -fr subdirectory"самый надежный способ сделать это, не в последнюю очередь потому что это работает, даже если файлы в подкаталоге содержат пробелы и т.п.. – Jonathan Leffler 08.09.2009, 23:49
  • 4
    Кроме того, мое впечатление от вопроса - то, что у пользователя есть файлы для хранения, а также файлы для удаления, таким образом, общее удаление подкаталога не является частью ответа. – Jonathan Leffler 08.09.2009, 23:53
  • 5
    я надеюсь, что Вы вниз не проголосовали за меня, потому что это НЕ удаляет файлы в подкаталоге. Я удаляю файлы в текущем каталоге, которые имеют то же имя как файл в подкаталоге. – Alvin Row 09.09.2009, 00:41

Чтобы подробно остановиться на концептуально правильном решении Pynt, можно обработать файлы с пробелами на их имена при помощи опций пустого разделителя находки и xargs:

Предположим, что Ваша папка загрузок ~/Downloads/, который содержит файлы file 4 и file 5. Вы на самом деле хотели загрузить ряд файлов (file 1, file 2, и file 3) к подкаталогу ~/Downloads/subdir/. Вы случайно загрузили те файлы на ~ / Загрузки/, затем Вы загрузили их правильно на ~/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 '"{}"

Тот код не удалит файлы. Это отправит их в мусор вместо этого, пока Вы установили пакет мусора-cli. (См., отменяют комнату Linux? для большего количества информации о команде мусора, которую я настоятельно рекомендую.), Если Вы жили бы опасно, замена trash с rm. Если Вы хотите жить еще менее опасно, заменить trash с echo trash. Это просто распечатает команды, которые удалят Ваши файлы.

Так или иначе вот объяснение, так как Вы никогда не должны доверять коду, который Вы не понимаете. Первая строка просто перемещается в каталог Downloads. Вторая строка находит и печатает названия всех файлов в subdir. pushd и popd точно так же, как cd, только с кнопкой "Назад". (Ищите стеки, если Вы задаетесь вопросом, куда "нажатие" и "поп" прибывают из.) Опции к find скажите этому только перечислять вещи в subdir и не, например, subdir/another subdir/third subdir. Они также говорят этому не перечислять ., название самого текущего каталога. Вы не хотите удалять это. Наконец, -print0 опция говорит find для печати файлов, это находит, но разделите их с нулевыми символами вместо пробела. Это - то, как мы имеем дело с пробелами.

Аналогично, в третьей строке, --null опция к xargs говорит этому читать имена файлов из find с нулевыми символами, разделяющими их. Остальная часть третьей строки создает команду, которая удалит Ваши файлы.

Урок в целом - то, что необходимо обработать файлы, которые могли бы иметь пробелы, обычно необходимо использовать команду, которая включает find -print0 | xargs --null.

2
ответ дан 12.12.2019, 07:55

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

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

Я не протестировал его, таким образом, необходимо протестировать его перед выполнением его для реального :)

1
ответ дан 12.12.2019, 07:55

Pynt и Peltier имеют это общее представление, но только Peltier's обработает файлы с пробелами.

Это должно работать:

cd path-to-subdirectory
set -- *
cd -
ls -ld "$@" | more    # Make sure the list is what you expect to remove, then:
rm -rf "$@"

Я показываю использование "ls" для подтверждения списка файлов перед удалением для исправности.

Но Вы могли также переместить их во временное место (включая архив ZIP), если Вы обеспокоены удалением неправильного материала. Просто замените "комнату" выше или следующего, затем если Вы доверяете тому, что произошло, удалите ZIP или временный каталог:

mkdir /tmp/to-nuke ; mv -vi "$@" /tmp/to-nuke
zip -0rm backup.zip "$@"
0
ответ дан 12.12.2019, 07:55

Теги

Похожие вопросы