申し訳ありません。他に答えがある場合は、私の質問をどのように検索するのかわかりません。
Redhat Linux HPCサーバーでいくつかのシミュレーションを実行していますが、出力を保存するためにフォルダ構造を処理するコードに不幸なバグがあります。フォルダを作成する私のMATLABコードは次のとおりです。
folder = [sp.saveLocation, 'run_', sp.run_number, '/'];
sp.run_number
整数はどこにありますか?文字列に変換するのを忘れましたが、何らかの理由でmkdir(folder);
matlabで実行しても成功します。実際、シミュレーションはスムーズに実行され、データは一致するディレクトリに保存されます。
これで、フォルダ構造を照会/印刷すると、次のようになります。
- タブオートコンプリートを使用しようとすると:
run_ run_^A/ run_^B/ run_^C/ run_^D/ run_^E/ run_^F/ run_^G/ run_^H/ run_^I/
- 私が使用するとき
ls
:run_ run_? run_? run_? run_? run_? run_? run_? run_? run_? run_?
- rsyncを使用してMacに転送すると、
--progress
オプションは次のように表示されます。run_\#003/
(私の家では)3桁の数字で埋められた整数と一致する数値なsp.run_number
ので、10番目の実行は次のようになります。run_\#010/
- Finderでフォルダを見ると
run_ run_ run_ run_ run_ run_ run_ run_ run_ run_?
- 見ているこれ質問を受け、私が得たコマンドを使用して
ls | LC_ALL=C sed -n l
:
run_$
run_\001$
run_\002$
run_\003$
run_\004$
run_\005$
run_\006$
run_\a$
run_\b$
run_\t$
run_$
cd
これらの表現を使用すると、フォルダに入ることはできません。
このようなフォルダは何千ものあるため、この問題を解決するにはスクリプトが必要です。次のオプションのうち、フォルダを正しく表現したものは何ですか? bashスクリプトを使用して正しい形式の名前に名前を変更できるように、プログラムでこれらのフォルダを参照するにはどうすればよいですか?気になってそうだが、一体どうやってこんなことが起きたのでしょうか?
ベストアンサー1
Perlユーティリティ(またrename
はとも呼ばれる)を使用してディレクトリの名前を変更できます。prename
file-rename
メモ:または他のバージョンrename
と混同しないでください。util-linux
rename -n 's/([[:cntrl:]])/ord($1)/eg' run_*/
これはPerlのord()
機能を使用して、ファイル名の各制御文字をその文字の序数で置き換えます。たとえば、^A
1になり^B
2になります。
この-n
オプションは、コンテンツを表示するためのテスト実行に使用されます。rename
会議許可されている場合は、そうしてください。実際に名前を変更するには、それを削除するか、-v
詳細な出力に置き換えてください。
e
操作の修飾子は、s/LHS/RHS/eg
perlにRHS(代替)をPerlコードで実行させ、$1
LHSの一致データ(制御文字)です。
ファイル名にゼロで埋められた数字を使用するには、ord()
たとえばsprintf()
。
$ rename -n 's/([[:cntrl:]])/sprintf("%02i",ord($1))/eg' run_*/ | sed -n l
rename(run_\001, run_01)$
rename(run_\002, run_02)$
rename(run_\003, run_03)$
rename(run_\004, run_04)$
rename(run_\005, run_05)$
rename(run_\006, run_06)$
rename(run_\a, run_07)$
rename(run_\b, run_08)$
rename(run_\t, run_09)$
上記の例はうまくいきますそして、もし sp.run_number
matlabスクリプトでは、その範囲は0..26です(したがって、ディレクトリ名に制御文字を生成します)。
1 バイト文字 (たとえば、0..255 から始まる) を処理するには、次を使用できます。
rename -n 's/run_(.)/sprintf("run_%03i",ord($1))/e' run_*/
255以上が可能な場合は、代わりにsp.run_number
Perlの関数を使用する必要があります。 matlabが変換されていないintを文字列として出力する方法がわからないので、実験する必要があります。詳細より。unpack()
ord()
perldoc -f unpack
たとえば、次のコードは8ビットと16ビットの符号なし値を解凍し、5ビット幅でゼロパディングします。
rename -n 's/run_(.*)/sprintf("run_%05i",unpack("SC",$1))/e' run_*/