数えていないmv
、あなたは本当にすべてで、このために外部のプロセスを必要としない-あなたはできる種類だけのパッと消えるそれら。
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
)
それでも、これはmv
ファイルごとの呼び出しを意味するので、おそらくrename
より良い方法です。これは唯一のPOSIX与えられた動作するはずですけれどもmv
内$PATH
およびPOSIXシェル。
だから、私はこれのために一種のクレイジーなデモを思いつきました。テストセットは次のように生成されます。
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
最初に、上記のコマンドが他の方法でより簡単に取得できる結果を生成することを最初に認めます。しかし、他の方法では、おそらく何が行われるのか、$IFS
そして少し(病気ですか?)想像力も実証されないでしょう。
したがって、最初のビットはかなり単純です。
tee
その入力の5つのコピーをパイプアウトします-ヒアドキュメントは CGEN
dd
ブロックごとに90バイトで改行によって入力をブロックし、それをパイプして...
sed
これらのブロックの2つを2つの\n
ewline文字で'
結合し、結果を単一引用符で囲み、touch --
パイプラインする前にすべてのラインサイクルの文字列を先頭に追加します...
sh
次に、すべての入力をシェルコマンドとして実行します
#CGEN
ビットしかし...まあ、簡単に...
下部printf
は252 0sを印刷します
next from lastは252個の''
null文字列引数を受け取り、それぞれの内容を表示し、$n
その後に文字列を続けます" $i "
eval
次の引数を解釈してから、printf
その解釈の結果を2つのバックスラッシュを前に付けた8進数として出力します
最後printf
は、これらの8進数のバイト値を一度に2つずつ出力し、その後-_ ---___
に各ペアの文字列を出力します
$n
$i
値10、39、または47をスキップすることを除いて、評価ごとに1 ずつ増加する方程式に初期化されます(これらはそれぞれ、ASCII 10進数の\n
ewline、'
単一引用符、および/
スラッシュです)。
最終結果は、単一引用符(1つ以上のsed s///
ステートメントを避けるためにスキップされます)と/
スラッシュを除いて、文字セットの1から255までのすべてのバイトを含む非常に醜いファイル名を多く含むディレクトリです。これらのファイル名は次のようになります。
(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 -_ ---___$
次に、これらのファイルに関するデータを取得します。
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 '_ -'
出力
#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
OK。最後に、アクションに:
ifsqz '_ -'
chksqz '_ -'
出力
#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
成功!あなたはあなた自身のために見ることができます:
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