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
ディレクトリがそこにあります。
答え1
@Theophrastusは正しい考えを持っています。~によるとPOSIX「[ファイル]名を構成する文字は、任意の文字値セットから選択できます。スラッシュ文字を除くと null バイト"(強調)。つまり、各文字列は〜サイスラッシュ2個(空の文字列を除外)は別のディレクトリであり、できない名前にスラッシュを含むファイルを作成します。したがって、これを試みると、touch /root/tinstalls/2--06/06/15
システムは15
絶対パスを使用してディレクトリにファイルを作成しようとします/root/tinstalls/2--06/06
。
この問題を修正する簡単な方法は、ファイル名のすべてのスラッシュを下線で置き換えることです。
touch "/root/tinstalls/${tfile//\//_}"
答え2
タッチするとディレクトリを作成できません。例えば ねえ
「すぐそこにディレクトリ」があるようです。しかし、日付形式にさらにディレクトリが必要な「/」文字が含まれていることをご存知でしたか?
答え3
他の人がすでに説明したように、問題はディレクトリを作成しようとすると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')"
答え4
@Theophrastusは正しい考えを持っています。 POSIXによると、「[ファイル]名を構成する文字は、スラッシュ文字とヌルバイトを除く任意の文字値セットから選択できます」(強調)。つまり、2つのスラッシュ間のすべての文字列(空の文字列を除く)は別のディレクトリなので、名前にスラッシュを含むファイルを作成することはできません。したがって、/root/tinstalls/2--06/06/15をタッチしようとすると、システムは絶対パス/root/tinstalls/2--06/06を使用してディレクトリにファイル15を生成しようとします。
この問題を修正する簡単な方法は、ファイル名のすべてのスラッシュを下線で置き換えることです。
touch "/root/tinstalls/${tfile//\//_}"