Ohne zu zählen mv
, brauchen Sie dafür überhaupt keinen externen Prozess - Sie können sie einfach nur bescheißen .
ifsqz() ( LC_ALL=C sqz=$1
isf() { [ -e "$1" ] || [ -L "$1" ] ; }
set -- * ; set -f
for f do isf "$f" || break
IFS=$sqz; set -- $f; IFS=
isf "$*" || mv -- "$f" "$*"
done
)
Dies bedeutet jedoch einen mv
Aufruf pro Datei und ist daher wahrscheinlich rename
besser. Dies sollte jedoch funktionieren, wenn nur ein POSIX mv
in $PATH
und eine POSIX-Shell vorhanden sind.
Also habe ich mir dafür eine Art verrückte Demo ausgedacht. Der Testsatz wird wie folgt generiert:
tee - - - - <<CGEN |\
dd cbs=90 conv=unblock |\
sed 'G;$!N'";s/^/touch -- '/;s/$/'/" |sh
$( #BEGIN CGEN
LC_ALL=C
i= n='"$((i=((i=i+1)==10||i==39||i==47)>0?(i+1):i))"'
printf '%b -_ ---___' $(
IFS=0; eval \
printf '"\\\\%04o\\\\%04o "' "$(
printf "$n"' "$i" '%s $(
printf %.252d
#END
))"))
CGEN
Zunächst werde ich als erster anerkennen, dass der obige Befehl Ergebnisse liefert, die auf andere Weise leichter zu erhalten sind. Aber andere Mittel würden wahrscheinlich nicht so gut zeigen, was mit $IFS
ein wenig (krank?) Fantasie getan werden könnte .
Das erste Bit ist also ziemlich einfach:
tee
leitet 5 Kopien seiner Eingabe heraus - das heredocument heißt CGEN
dd
blockiert seine Eingabe durch Zeilenumbrüche mit 90 Bytes pro Block und leitet diese an ...
sed
\n
Verbindet 2 dieser Blöcke mit zwei Ewline-Zeichen, setzt '
die Ergebnisse in einfache Anführungszeichen und stellt die Zeichenfolge touch --
für jeden Zeilenzyklus voran, bevor sie an ...
sh
Das führt dann alle Eingaben als Shell-Befehle aus
Das #CGEN
bisschen aber ... Nun, kurz ...
Die Unterseite printf
druckt 252 0s
Der vorletzte erhält 252 ''
Null-String-Argumente und druckt für jeden den Inhalt von $n
gefolgt von dem String" $i "
eval
interpretiert die Argumente des nächsten nach oben, printf
bevor die Ergebnisse dieser Interpretation als Oktalzahlen gedruckt werden, denen 2 Backslashes pro Stück vorangestellt sind
Der letzte gibt printf
die Bytewerte für diese Oktale 2 gleichzeitig aus, gefolgt von der Zeichenfolge -_ ---___
für jedes Paar
$n
wird mit einer Gleichung initialisiert, die $i
bei jeder Auswertung um eins erhöht wird, mit der Ausnahme, dass die Werte 10, 39 oder 47 übersprungen werden ( \n
ewline, '
einfache Anführungszeichen und /
Schrägstrich in ASCII-Dezimalzahl).
Das Endergebnis ist ein Verzeichnis mit vielen wirklich hässlichen Dateinamen, die jedes Byte in meinem Zeichensatz von 1 bis 255 enthalten, mit Ausnahme des einfachen Anführungszeichens (nur übersprungen, um eine weitere sed s///
Anweisung zu vermeiden ) und des /
Schrägstrichs. Diese Dateinamen sehen folgendermaßen aus:
(set -- *; printf '%s\n\n##############\n\n%s\n' "${9}" "${34}") | cat -A
---___ww -_ ---___xx -_ ---___yy -_ ---___zz -_ ---___{{ -_ ---___|| -_ ---$
$
___}} -_ ---___~~ -_ ---___^?^? -_ ---___M-^@M-^@ -_ ---___M-^AM-^A -_ ---___M-^BM-^B -_ ---___M-^CM-^C$
$
##############$
$
-_ ---___M-ZM-Z -_ ---___M-[M-[ -_ ---___M-\M-\ -_ ---___M-]M-] -_ ---___M-^M-^ -_ ---___M-_M-_ -_$
$
---___M-`M-` -_ ---___M-aM-a -_ ---___M-bM-b -_ ---___M-cM-c -_ ---___M-dM-d -_ ---___M-eM-e -_ ---___$
Jetzt werde ich einige Daten zu diesen Dateien erhalten:
chksqz() ( LC_ALL=C sqz=$1
set -- * ; set -f ; IFS= ; tc="$*"
printf '#%s\n' \
"There are $# files in this test directory." \
"All filenames combined contain a total of ${#tc} bytes."
IFS=$sqz ; set -- $* ; IFS= ; sc="$*"
printf "%s '$sqz'" \
"#Of which ${#sc} bytes are not"\
" and $((${#tc}-${#sc})) bytes are"
set +f ; unset IFS
printf ".\n#%s\n#Total:\t%d\n#Other:\t%d\n#'$sqz':\t%d\n" \
"And to confirm these figures:" \
$( printf %s * | wc -c
printf %s * | tr -d "$sqz" | wc -c
printf %s * | tr -dc "$sqz" | wc -c
))
chksqz '_ -'
AUSGABE
#There are 101 files in this test directory.
#All filenames combined contain a total of 17744 bytes.
#Of which 2692 bytes are not '_ -' and 15052 bytes are '_ -'.
#And to confirm these figures:
#Total: 17744
#Other: 2692
#'_ -': 15052
In Ordnung. Nun endlich zum Handeln:
ifsqz '_ -'
chksqz '_ -'
AUSGABE
#There are 101 files in this test directory.
#All filenames combined contain a total of 2692 bytes.
#Of which 2692 bytes are not '_ -' and 0 bytes are '_ -'.
#And to confirm these figures:
#Total: 2692
#Other: 2692
#'_ -': 0
Erfolg! Sie können selbst sehen:
ls
????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
???????????????????????????
???????????????????????????
???????????????????????????
????????????????????????????
????????????????????????????
????????????????
??????????????????????
????????????????????????
??????????????????????????
??????????????????????????
??????????????????????????
??????????????????????????
???????????????????????????
???????????????????????????
???????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
??????????????????????????
????????????????????????
????????????????????
??????????????????
????????????????????????????
??
????????????????????????????
??????????????????????????
????????????????????????????
????????????????????????????
????????????????????!!""##
??????????????????!!""##$$
????????????????!!""##$$%%
????????????!!""##$$%%&&((
????????!!""??##$$%%&&(())
$$%%&&(())**??++,,..0011
%%&&(())**++??,,..00112233
&&(())**++,,??..0011223344
))**++,,..??0011223344556
**++,,..00??11223344556677
22334455667788??99::;;<<==>>
445566778899??::;;<<==>>??@@
5566778899::;;??<<==>>??@@AA
6778899::;;<<??==>>??@@AABB
8899::;;<<==??>>??@@AABBCCDD
\\]]^^``aa??bbccddeeffgghh
]]^^``aabbc??cddeeffgghhii
^^``aabbccdd??eeffgghhiijj
??@@AABBCCDDEE??FFGGHHIIJJKK
AABBCCDDEEFF??GGHHIIJJKKLLM
BBCCDDEEFFGG??HHIIJJKKLLMMNN
CCDDEEFFGGHHII??JJKKLLMMNNOO
EEFFGGHHIIJJ??KKLLMMNNOOPPQQ
ffgghhiijjkk??llmmnnooppqqrr
gghhiijjkkllmm??nnooppqqrrss
iijjkkllmmnn??ooppqqrrsstt
jjkkllmmnnoo??ppqqrrssttuuvv
kkllmmnnooppqq??rrssttuuvvww
LLMMNNOOPPQQRR??SSTTUUVVWWXX
MNNOOPPQQRRSS??TTUUVVWWXXYY
OOPPQQRRSSTT??UUVVWWXXYYZZ[[
PPQQRRSSTTUUVV??WWXXYYZZ[[\\
RRSSTTUUVVWW??XXYYZZ[[\\]]
ssttuuvvwwxx??yyzz{{||}}~~??
ttuuvvwwxxyyz??z{{||}}~~????
uuvvwwxxyyzz{{??||}}~~??????
wwxxyyzz{{||??}}~~??????????
xxyyzz{{||}}~~??????????????
YYZZ[[\\]]^^??``aabbccddee
ZZ[[\\]]^^``??aabbccddeeff