Скрипт для скрытия файлов

Скрипт для скрытия файлов

Недавно я нашел скрипт для скрытия файлов и папок на рабочем столе. Ниже приведен скрипт:

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

Скрипт работает неправильно. Он не скрывает файлы, в именах которых есть пробелы. Например, если у меня есть файл с именем «Untitled Document», я получаю следующие ошибки. . .

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

Пожалуйста, дайте мне знать, почему скрипт ведет себя таким образом. Может ли кто-нибудь исправить скрипт для меня? Спасибо заранее.

решение1

Скрипт, который вы нашли, имеет недостатки в синтаксическом анализе вывода 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

Используя 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

Связанный контент