Відповіді:
Команда:
ls -ld .?*
Буде лише список прихованих файлів.
Поясніть:
-l use a long listing format
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
.?* will only state hidden files
.
та ..
зі збігу. Однак це також виключає (цілком законні) односимвольні приховані імена файлів , таких як .a
, .1
і так далі. Можливо, краще розширений глобус буде .!(|.)
тобто буквальною крапкою, за якою слідує все, крім нічого або іншої (однієї) крапки, тобтоls -d .!(|.)
ls -d .!(|.)
Робить саме те, що шукає ОП.
!(pattern-list)
, pattern-list
це список одного або декількох шаблонів, розділених символом a |
, але для мене це заплутано те, що у вас немає шаблону зліва від |
. Не могли б ви пояснити мені цей синтаксис?
.
не супроводжується (нічого або .
), виключаючи .
себе і ..
.
Якщо ви просто хочете, щоб файли у вашому поточному каталозі (без рекурсії), ви можете це зробити
echo .[^.]*
Це дозволить надрукувати імена всіх файлів, ім’я яких починається з а, .
а потім - один або кілька неточних символів. Зауважте, що це не вдасться для файлів, ім'я яких починається з послідовних крапок, тому, наприклад ....foo
, не відображатиметься.
Ви також можете використовувати find
:
find -mindepth 1 -prune -name '.*'
У -mindepth
гарантую , що ми не відповідаємо .
і -prune
засобів , які find
зійдуть в підкаталоги.
Використання find
та awk
,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
Пояснення:
find . -type f
-> Список усіх файлів у поточному каталозі, а також шлях,
./foo.html
./bar.html
./.foo1
awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
як сепаратор поля awk перевіряє, чи останнє поле дивиться крапкою чи ні. Якщо він починається з крапки, то він друкує останнє поле відповідного рядка.
find -type f
. Вам не потрібно явно вказати шлях пошуку або -name "*"
.
find
зазвичай є кращим варіантом для складних пошуків, ніж використання глобальних імен.
find . -mindepth 1 -maxdepth 1 -name '.*'
або
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
find .
шукає поточний каталог
-mindepth 1
виключає. і .. зі списку
-maxdepth 1
обмежує пошук у поточному каталозі
-name '.*'
знайти імена файлів, які починаються з крапки
-o
або
-name '*~'
знайти імена файлів, які закінчуються тильдом (зазвичай це резервні файли з програм редагування тексту)
Однак ця та всі інші відповіді пропускають файли, які знаходяться у .hidden
файлі поточного каталогу . Якщо ви пишете сценарій, ці рядки будуть читати .hidden
файл та відображати назви файлів із тих, що існують.
if [[ -f .hidden]] # if '.hidden' exists and is a file
then
while read filename # read file name from line
do
if [[ -e "$filename" ]] # if the read file name exists
then
echo "$filename" # print it
fi
done < .hidden # read from .hidden file
fi
.hidden
файл? Чому б коли-небудь існував файл, який називається, .hidden
який містить імена файлів? У будь-якому випадку, якщо є один, чому б ти зробив щось таке складне, коли все, що тобі було б потрібно cat .hidden
? Ваша find
команда правильна (ish), але -name '*~'
це не має значення. Файли, які закінчуються в тильдах, є резервними файлами, але не прихованими.
.hidden
Файл призначений для файлів і папок, які ви хочете приховати, коли ви не можете змінити ім'я файла / папки, щоб почати з крапки. Що стосується файлів, які закінчуються в тильдах, це залежить від системи. ls -B
ігнорує такі файли, як і більшість дослідників файлів GUI.
cat .hidden
можуть відображатися файли, які більше не існують, якщо ці файли були видалені або переміщені з моменту додавання до .hidden
файлу.
Я думаю, що ви можете це зробити за допомогою наступної команди.
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
команда, яку ви ввели, що показує всі файли та каталоги в поточному робочому каталозі.
grep "^\."
Команда, яку я додав, фільтрує вихід, показуючи лише приховані файли (це ім'я починається з "."
).
grep -v "^\.$" | grep -v "^\..$"
Команда, яку я додав, фільтрує вихід, щоб виключити., .. (Вони є поточним та батьківським каталогом).
Якщо деякі назви файлів можуть мати більше рядка з "\n"
, приклад вище може бути невірним.
Тому я пропоную наступну команду для вирішення цього питання.
find -maxdepth 1 -name ".[!.]*"
ls
слід розбирати вихід .
Що ще ви могли зробити, is ls .?*
або ls .!(|)
це покаже вам все в поточному режимі прихованих файлів / dirs вгорі та інших файлів / dirs внизу
наприклад: з мого терміналу
$ ls .?*
.bash_history .dmrc .macromedia .weather
.bash_logout .gksu.lock .profile .wgetrc
.bash_profile .bashrc.save .ICEauthority .toprc .Xauthority
.bashrc .lastdir .viminfo .xsession-errors
.bashrc~ .dircolors .lynxrc .vimrc .xsession-errors.old
..:
Baron
.adobe:
Flash_Player
.aptitude:
cache config
.cache:
compizconfig-1 rhythmbox
dconf shotwell
Тепер зауважте у наведених вище результатах, він показує вам кожен файл / dir зі своїм субдірром та будь-які приховані файли прямо внизу.
[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases .bashrc1 .bashrc1~
..:
askapache-bash-profile.txt examples.desktop Public top-1m.csv
backups Firefox_wallpaper.png PycharmProjects top-1m.csv.zip
Desktop java_error_in_PYCHARM_17581.log Shotwell Import Log.txt topsites.txt
Documents Music Templates Videos
Downloads Pictures texput.log vmware
Вибачте, я не можу коментувати. щоб пояснити різницю між тут ls .?*
і @ cioby23 відповідь ls -d .[!.]* .??*
А чому це насправді друкувати приховані файли в два рази , тому що буквально ви питаєте двічі .??*
, .?*
, .[!.]*
вони те ж саме, так що додавання будь-якого з них з різними символами команди будуть друкувати в два рази.
Усі відповіді поки що засновані на тому, що файли (або каталоги), імена яких починаються з крапки, "приховані". Я придумав інше рішення, яке може бути не настільки ефективним, але це рішення не передбачає нічого про назви прихованих файлів, а тому уникає внесення списку ..
в результат (як і відповідь, що приймається на даний момент).
Повна команда:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
Пояснення
Для цього потрібно перерахувати всі файли (та каталоги) двічі,
echo -e "$(\ls)\n$(\ls -A)"
але показувати приховані файли лише один раз -A
.
Далі список сортується, | sort
завдяки чому звичайні (невідомі) файли з’являються двічі та поруч.
Потім видаліть усі рядки, які з’являються не один раз | uniq -u
, залишивши лише унікальні рядки.
Нарешті, використовуйте ls
ще раз, щоб перелічити всі файли зі спеціальними параметрами користувача та без перерахування вмісту каталогів у списку -d
.
EDIT (обмеження):
Як зауважив Муру, це рішення не працюватиме належним чином, якщо є файли з такими іменами, як, escaped\ncharacter.txt
тому що echo -e
розділить ім'я файлу на два рядки. Він також не буде працювати, як очікувалося, якщо є два приховані файли з майже однаковим іменем, за винятком спеціального символу, таких як .foo[tab].txt
і .foo[new-line].txt
як обидва вони надруковані як .foo?.txt
і будуть усуненіuniq -u
.
першим символом.
..
, але мені цікаво, наскільки добре він працює з іменами, що містять спеціальні символи.
echo -e
будуть інтерпретувати. Також: ls
не заблокуйте назви файлів, щоб дві різні імена файлів відображалися однаково (наприклад, у деяких версіях ls
використовуватимуться ?
для спеціальних символів, тому .foo\tbar
( \t
=> вкладка) та .foo\nbar
( \n
=> новий рядок) обидва відображатимуться як foo?bar
).
Крім того, ви також можете використовувати echo .*
напр
user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$
Якщо ви віддаєте перевагу у форматі довгого списку, просто перетворіть пробіл у новий рядок.
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
З bash, встановлення GLOBIGNORE
спеціальної змінної є деяким не порожнім значенням, щоб її ігнорувати .
і ..
при розширенні глобусів. З документів Bash :
GLOBIGNORE
Змінної оболонки можуть бути використані для обмеження безлічі імен файлів , відповідних шаблоном. ЯкщоGLOBIGNORE
встановлено, кожне ім'я відповідного файла, яке також відповідає одному з шаблонів уGLOBIGNORE
, видаляється зі списку збігів. Якщоnocaseglob
параметр встановлений, відповідність шаблонам уGLOBIGNORE
виконується незалежно від випадку. Імена файлів.
і..
завжди ігноруються, колиGLOBIGNORE
встановлено, а не є недійсним. Однак встановленняGLOBIGNORE
ненульового значення може призвести до ввімкнення параметра оболонки dotglob, тому всі інші імена файлів, що починаються з‘.
', будуть відповідати.
Якщо ми встановимо це на .:..
обидва, .
і ..
будемо проігноровано. Оскільки встановлення його на що-небудь ненулеве також отримає таку поведінку, ми можемо також встановити його як раз.
Тому:
GLOBIGNORE=.
ls -d .*
ls -ld .*
абоls -ald .*
спрацює