mkdir
を使用してディレクトリを作成し、touch
を使用してファイルを作成できることを知っていますが、両方の操作を一度に行う方法はありませんか?
つまり、フォルダother
が存在しないときに以下を実行したい場合:
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
エラー:
cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory
誰かがこれの回避策として機能を考え出しましたか?
&&
を使用して、2つのコマンドを1つのシェル行に結合します。
COMMAND1 && COMMAND2
mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt
注:以前は、;
を使用して2つのコマンドを分離することをお勧めしましたが、@ trysisが指摘したように、&&
が失敗した場合でもCOMMAND1
も実行されないため、ほとんどの状況でCOMMAND2
を使用することをお勧めします。 (そうしないと、予期しない問題が発生する可能性があります。)
最初にすべての親ディレクトリを作成する必要があります。
FILE=./base/data/sounds/effects/camera_click.ogg
mkdir -p "$(dirname "$FILE")" && touch "$FILE"
創造的になりたい場合は、 関数を作成 :
mktouch() {
if [ $# -lt 1 ]; then
echo "Missing argument";
return 1;
fi
for f in "$@"; do
mkdir -p -- "$(dirname -- "$f")"
touch -- "$f"
done
}
そして、他のコマンドと同じように使用します:
mktouch ./base/data/sounds/effects/camera_click.ogg ./some/other/file
/ usr/bin/installで実行します。
install -D /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
ソースファイルがない場合:
install -D <(echo 1) /my/other/path/here/cpedthing.txt
これは私がすることです:
mkdir -p /my/other/path/here && touch $_/cpredthing.txt
ここで、$_
は、前に実行したコマンドの最後の引数を表す変数です。
いつものように、出力がどうなるかを見たい場合は、次のようにecho
コマンドを使用してテストできます。
echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
次のように出力されます:
mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt
おまけとして、ブレース展開を使用して、複数のファイルを一度に書き込むことができます。次に例を示します。
mkdir -p /code/temp/other/path/here &&
touch $_/{cpredthing.txt,anotherfile,somescript.sh}
繰り返しますが、echo
で完全にテスト可能です:
mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt /code/temp/other/path/here/anotherfile /code/temp/other/path/here/somescript.sh
次の2つの手順で実行できます。
mkdir -p /my/other/path/here/
touch /my/other/path/here/cpedthing.txt
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"
私がUnixフォーラムで見てテストしたように、これは問題を解決します
ptouch() {
for p in "$@"; do
_dir="$(dirname -- "$p")"
[ -d "$_dir" ] || mkdir -p -- "$_dir"
touch -- "$p"
done
}
if [ ! -d /my/other ]
then
mkdir /my/other/path/here
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
fi
if then
ステートメントの必要はありません... ;
を使用して1行で実行できます
mkdir -p /my/other/path/here;cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
-または2行で-
mkdir -p /my/other/path/here
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
--p
は、ディレクトリが既に存在する場合にエラーが返されるのを防ぎます(これは私がここで探しているものです:))
同じディレクトリ階層を再作成しようとする特殊な(ただし珍しいことではない)場合、cp --parents
が役立ちます。
たとえば、/my/long
にソースファイルが含まれていて、my/other
が既に存在する場合、これを行うことができます。
cd /my/long
cp --parents path/here/thing.txt /my/other