Сценарий для сокрытия файлов

Я недавно нашел сценарий для сокрытия файлов на рабочем столе и папок. Следующее является сценарием:

#!/bin/bash
#
cd /home/ramvignesh/Desktop
for f in `ls`; do
mv "$f" ".$f"
done

Сценарий не работает правильно. Это не скрывает файлы, названные с пробелами в них. Например, Если у меня есть файл под названием 'Документ без названия', я получаю следующие ошибки...

mv: cannot stat ‘Untitled’: No such file or directory
mv: cannot stat ‘Document’: No such file or directory

Сообщите мне, почему сценарий ведет себя таким способом. Кто-либо может исправить сценарий для меня?Заранее спасибо.

4
задан 10 November 2017 в 18:54

2 ответа

Сценарий, который Вы нашли, испорчен с парсингом вывода ls команда (можно читать о том, почему Вы не должны использовать ls в сценариях здесь ).

А лучший подход должен использовать find команда и передать свой вывод по каналу к xargs.

С тех пор в исходном сценарии Вы воздействуете на файлы, которые находятся в определенном каталоге, я адаптировал команду соответственно. Перейдите к каталогу, где Вы хотите скрыть файлы и выполнить рев части:

find . -maxdepth 1 -type f ! -name ".*" -printf "%f\0" | xargs -0 -I file mv file .file

Вот маленькая демонстрация в моем корневом каталоге. Я создаю 3 файла и использование выше команды для сокрытия их.

$ touch file1 file2 file3


$ find . -maxdepth 1 -type f ! -name  ".*" -printf "%f\0" | xargs -0 -I file mv file .file 


$ ls -a
./             .bash_logout  Desktop/    .file1   .gnupg/        .macromedia/  Pictures/  .ssh/        .xsession-errors
../            .bashrc       .dmrc       .file2   .ICEauthority  .mkshrc       .profile   Templates/   .xsession-errors.old
.adobe/        .cache/       Documents/  .file3   .lesshst       .mozilla/     .psensor/  Videos/
.bash_history  .config/      Downloads/  .gconf/  .local/        Music/        Public/    .Xauthority

вышеупомянутые работы для файлов. Заставить его работать на каталоги, просто измениться -type f на -type d.

Демонстрация:

$ ls
dirone/  dirthree/  dirtwo/


$ find . -maxdepth 1 -type d ! -name  ".*" -printf "%f\0" | xargs -0 -I file mv file .file                                                           


$ ls


$ ls -a
./  ../  .dirone/  .dirthree/  .dirtwo/
2
ответ дан 1 December 2019 в 10:20

Используя rename и немного сценария с именем hide_desktop_files.

#!/bin/bash
dir="$PWD"
cd ~/Desktop
rename 's/(.*)/.$1/' *
cd "$dir"
<час>

Пример

% ls -ogla ~/Desktop
total 92
drwxr-xr-x   3  4096 Aug 15 20:45 .
drwxr-xr-x 236 86016 Aug 15 20:46 ..
-rw-rw-r--   1     0 Aug 15 20:45 bar
-rw-rw-r--   1     0 Aug 15 20:45 foo
drwxrwxr-x   2  4096 Aug 15 20:45 .foo

% ./hide_desktop_files                
rename(bar, .bar)
foo not renamed: .foo already exists

% ls -ogla ~/Desktop
total 92
drwxr-xr-x   3  4096 Aug 15 20:45 .
drwxr-xr-x 236 86016 Aug 15 20:47 ..
-rw-rw-r--   1     0 Aug 15 20:45 bar
-rw-rw-r--   1     0 Aug 15 20:45 foo
drwxrwxr-x   2  4096 Aug 15 20:45 .foo
0
ответ дан 1 December 2019 в 10:20

Другие вопросы по тегам:

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