Що це призначено робити?
ls
список файлів у поточному каталозі
$(ls)
замінює вихід ls
місця, які є аргументомrm
- По суті
rm $(ls)
призначений для видалення всіх файлів у поточному каталозі
Що не так з цією картиною?
ls
не вдається правильно обробити спеціальні символи у імені файлу. Користувачі Unix, як правило, радили використовувати різні підходи . Я також це показав у пов'язаному питанні про підрахунок імен файлів . Наприклад:
$ touch file$'\n'name
$ ls
file?name
$ rm $(ls)
rm: cannot remove 'file': No such file or directory
rm: cannot remove 'name': No such file or directory
$
Крім того, як правильно зазначено у відповіді Дениса, ім'я файлу з провідними тиреми можна інтерпретувати як аргумент rm
після заміни, що перемагає мету видалити ім'я файлу.
Що працює
Ви хочете видалити файли в поточному каталозі. Тому використовуйте глобус rm *
:
$ ls
file?name
$ rm $(ls)
rm: cannot remove 'file': No such file or directory
rm: cannot remove 'name': No such file or directory
$ rm *
$ ls
$
Ви можете використовувати find
команду. Цей інструмент часто рекомендується для більш ніж поточного каталогу - він може рекурсивно проходити через усе дерево каталогів та працювати з файлами через-exec . . .{} \;
$ touch "file name"
$ find . -maxdepth 1 -mindepth 1
./file name
$ find . -maxdepth 1 -mindepth 1 -exec rm {} \;
$ ls
$
У Python немає проблем зі спеціальними символами у іменах файлів, тому ми також можемо використовувати це (зауважте, що цей файл призначений лише для файлів, вам потрібно буде використовувати, os.rmdir()
і os.path.isdir()
якщо ви хочете працювати в каталогах):
python -c 'import os; [ os.remove(i) for i in os.listdir(".") if os.path.isfile(i) ]'
Насправді, команда вище може бути перетворена на функцію чи псевдонім ~/.bashrc
для стислості. Наприклад,
rm_stuff()
{
# Clears all files in the current working directory
python -c 'import os; [ os.remove(i) for i in os.listdir(".") if os.path.isfile(i) ]'
}
Perl версія цього була б
perl -e 'use Cwd;my $d=cwd();opendir(DIR,$d); while ( my $f = readdir(DIR)){ unlink $f;}; closedir(DIR)'