Видалити файли розміром 0 байт за допомогою командного рядка?


16

Отже, у мене з’явився каталог, наповнений іншими каталогами, і мені було цікаво, чи можна видалити файли, які не мають розміру. Зазвичай ці файли мають 0 байтів, і оскільки я хочу об'єднати всі ці підкаталоги, я міг би замінити ідеально законний файл на невагомий файл 0 байтів, і там з'являється мій законний файл. Будь-який спосіб видалити файли з нульовим байтом?

Відповіді:


34

Використовуйте команду Find, щоб знайти файли за розміром і друкувати імена файлів на стандартний вихід.

find . -type f -size 0b -print

Підставами -printз -deleteвидаляти файли , а не друкувати їх на екрані.

find . -type f -size 0b -delete

Тепер, чи є спосіб перенести файли з одного місця в інше, а конфлікти замінити, якщо розмір однаковий, але зберегти обидві копії, якщо розмір різний?
user245115

Це звучить як робота для rsync .

7
Ви можете використовувати -emptyзамість -size 0b.
Кевін

6

Знайдіть та видаліть усі файли розміром 0 рекурсивно:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Приклад:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo

4

Ви також можете зробити це безпосередньо в оболонці. Це може бути корисно, якщо ви не хочете видаляти порожні приховані файли (ті, ім’я яких починається з а .). У той час як ви можете це зробити findтак само, як альтернатива може бути сама оболонка:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Пояснення

  • shopt -s globstar: вмикає опцію globstar для bash, яка порівнює **одна або декілька підкаталогів. **/*відповідатиме всім файлам і директоріям у поточному каталозі та всіх його підкаталогах.
  • for file in **/*; do ...; done : повторити всі знайдені файли та каталоги;
  • [ ! -s "$file" ]: [ -s "$file" ]вірно, якщо файл існує і не порожній. Тому [ ! -s "$file" ]( !перевертає тест) вірно, якщо файл не існує або він порожній.
  • [ -f "$file" ]: вірно, якщо файл звичайний файл. Не каталог або файл пристрою чи посилання тощо
  • rm "$file" : видаліть файл.

&&Переконайтеся , що наступна команда виконується , тільки якщо попередній був успішним , так це буде тільки видалити порожні, звичайні файли.


і я подумав, моя відповідь складна :) +1
AB

2

Хоча більшість відповідей вище є правильною, подивіться на цю команду:

Файл розміром 0 байт означає порожній файл

хоча ви можете запустити цю команду:

find . -type f -empty -delete

це видалить усі порожні файли.

Ви можете подивитися ці файли перед видаленням:

find . -type f -empty

В Ubuntu 14.04 LTS без -type f, -emptyтакож будуть видалені порожні каталоги. Щойно перевірив сторінку людини.
Bulrush
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.