Ho problemi a citare un nome file che alla fine è passato a chmod
. Lo script è stato originariamente scritto per SSH StrictModes
e authorized_keys
, ma ho dovuto espanderlo a causa di un problema UMASK
che ha causato disagio al filesystem. Lo script è di seguito, e sta producendo carichi di:
chmod: /Users/<user>/Library/Application: No such file or directory
chmod: Support/TextMate/Managed/Bundles/HTML.tmbundle/Macros/Delete: No such file or directory
chmod: whitespace: No such file or directory
chmod: between: No such file or directory
chmod: tags.plist: No such file or directory
...
chmod: /Users/<user>/Library/Caches/com.operasoftware.Opera/Media: No such file or directory
chmod: Cache/index: No such file or directory
cut: stdin: Illegal byte sequence
...
Ho provato alcune soluzioni alternative, ma nessuna di queste ha aiutato. Ho provato a fare una doppia citazione come ""$file""
, ma il problema è persistito. Ho anche provato i segni di spunta posteriori (che sono scoraggiati in questo caso), ma il problema persisteva.
Il più vicino che ho avuto modo di citare era il disfunzionale "\"""$file""\""
. Ma poi si è chmod
lamentato del fatto che il nome file (tra virgolette) non fosse un vero file:
$ sudo ~/fix-perms.sh
chmod: "/Users/Shared/.localized": No such file or directory
chmod: "/Users/<user>/.CFUserTextEncoding": No such file or directory
chmod: "/Users/<user>/.lesshst": No such file or directory
Come posso citare il nome del file che ne risulta find
che viene passato chmod
? O come posso chmod
prendere il nome del file come singolo argomento?
$ cat ~/fix-perms.sh
#!/bin/bash
# Directories
find /Users/* -type d -exec chmod 0700 {} \;
find /Users/Shared -type d -exec chmod 0777 {} \;
# Files
for file in `find /Users/* -type f`;
do
if [ `file "$file" | cut -d":" -f 2 | grep -i -c executable` -eq 0 ];
then
`chmod 0600 "$file"`
else
`chmod 0700 "$file"`
fi
done
for user in `ls -A /Users`;
do
if [ -e "/Users/$user/.ssh/authorized_keys" ];
then
chmod 0600 "/Users/${user}/.ssh/authorized_keys"
fi
done
find | xargs sudo chmod
invece di srotolare tutto in un ciclo for in cui gli spazi ti fanno soffrire per iterare sulla variabile.