Ich habe kürzlich ein Skript zum Ausblenden von Desktopdateien und -ordnern gefunden. Das folgende Skript lautet:
#!/bin/bash
#
cd /home/ramvignesh/Desktop
for f in `ls`; do
mv "$f" ".$f"
done
Das Skript funktioniert nicht richtig. Es versteckt die Dateien nicht, deren Namen Leerzeichen enthalten. Wenn ich beispielsweise eine Datei mit dem Namen „Unbenanntes Dokument“ habe, erhalte ich die folgenden Fehler. . .
mv: cannot stat ‘Untitled’: No such file or directory
mv: cannot stat ‘Document’: No such file or directory
Bitte lassen Sie mich wissen, warum sich das Skript so verhält. Kann jemand das Skript für mich korrigieren? Vielen Dank im Voraus.
Antwort1
Das Skript, das Sie gefunden haben, weist einen Fehler bei der Analyse der ls
Befehlsausgabe auf (lesen Sie hier, warum Sie es nicht ls
in Skripten verwenden sollten).Hier).
Ein besserer Ansatz besteht darin, den Befehl zu verwenden find
und seine Ausgabe an weiterzuleiten xargs
.
Da Sie im Originalskript mit den Dateien arbeiten, die sich in einem bestimmten Verzeichnis befinden, habe ich den Befehl entsprechend angepasst. Navigieren Sie zu dem Verzeichnis, in dem Sie die Dateien verstecken möchten, und führen Sie den folgenden Teil aus:
find . -maxdepth 1 -type f ! -name ".*" -printf "%f\0" | xargs -0 -I file mv file .file
Hier ist eine kleine Demo in meinem Home-Verzeichnis. Ich erstelle 3 Dateien und verwende den obigen Befehl, um sie auszublenden.
$ 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
Das oben genannte funktioniert für Dateien. Damit es auch für Verzeichnisse funktioniert, ändern Sie es einfach -type f
in -type d
.
Demo:
$ 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/
Antwort2
Verwenden Sie rename
ein kleines Skript mit dem Namen hide_desktop_files
.
#!/bin/bash
dir="$PWD"
cd ~/Desktop
rename 's/(.*)/.$1/' *
cd "$dir"
Beispiel
% 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