web-dev-qa-db-ja.com

感動的な問題:2つの変数からファイル名を作成する

2つの変数からファイル名を作成しようとしています。

これはエラーメッセージです:

touch: cannot touch `/root/tinstalls/2--06/06/15': No such file or directory
2--06/06/15 19:54

これはコードです:

tdate=$(date '+%D %R')
tfile=$(echo "${toadd}--${tdate}")
touch /root/tinstalls/${tfile}

 echo $tfile

ディレクトリはそこにあります。

3
noscrodamus

@ Theophrastusは正しい考えを持っています。 によると [〜#〜] posix [〜#〜] "[ファイル]名を構成する文字はから選択できますすべての文字値のセットスラッシュ文字を除くおよびヌルバイト "(私の強調)。つまり、すべての文字列between2つのスラッシュ( 空の文字列を除く )は別のディレクトリであり、cannotスラッシュを含む名前のファイルを作成します。だからあなたがtouch /root/tinstalls/2--06/06/15、システムはファイルを作成しようとしています15絶対パスのあるディレクトリ内/root/tinstalls/2--06/06

これを修正する簡単な方法は、ファイル名のすべてのスラッシュを、たとえばアンダースコアに置き換えることです。

touch "/root/tinstalls/${tfile//\//_}"
8
l0b0

touchはディレクトリを作成できません。たとえば ここを参照

「ディレクトリはそこにあります」と表示されます。しかし、日付形式に「/」文字が含まれているため、より多くのディレクトリが必要になることに気づいていますか?

2
Theophrastus

他の人がすでに説明したように、問題は、dateのスラッシュがtouchにディレクトリを作成させようとすることです。できないので文句を言います。最も簡単な解決策は、日付形式を変更することです。これの代わりに:

$ date '+%D %R'
06/07/15 13:47

これを使って:

 $ date '+%F %R'
 2015-06-07 13:52

または、さらに良いことに、スペースを処理する必要がなく、これを使用します。

$ date '+%F-%R'
2015-06-07-13:52

最後に、スペースを含めることを主張する場合は、名前をtouchに渡すときに名前を引用する必要があります

touch /root/tinstalls/"${toadd}--$(date '+%F %R')"
2
terdon

@Theophrastusは正しい考えを持っています。 POSIXによると、「[ファイル]名を構成する文字は、スラッシュ文字とヌルバイトを除くすべての文字値のセットから選択できます」(私の強調)。つまり、2つのスラッシュの間のすべての文字列(空の文字列を除く)は別のディレクトリであり、スラッシュを含む名前のファイルを作成することはできません。したがって、/ root/tinstalls/2--06/06/15をタッチしようとすると、システムは絶対パス/ root/tinstalls/2--06/06を使用してディレクトリ内にファイル15を作成しようとします。

これを修正する簡単な方法は、ファイル名のすべてのスラッシュを、たとえばアンダースコアに置き換えることです。

touch "/root/tinstalls/${tfile//\//_}"
0
noscrodamus