web-dev-qa-db-ja.com

Unix-フォルダーとファイルのパスを作成する

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

誰かがこれの回避策として機能を考え出しましたか?

116
toop

&&を使用して、2つのコマンドを1つのシェル行に結合します。

COMMAND1 && COMMAND2
mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt

注:以前は、;を使用して2つのコマンドを分離することをお勧めしましたが、@ trysisが指摘したように、&&が失敗した場合でもCOMMAND1も実行されないため、ほとんどの状況でCOMMAND2を使用することをお勧めします。 (そうしないと、予期しない問題が発生する可能性があります。)

128
evotopid

最初にすべての親ディレクトリを作成する必要があります。

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
75

/ 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
20
Ivan Dives

これは私がすることです:

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
12
Sgnl

次の2つの手順で実行できます。

mkdir -p /my/other/path/here/
touch /my/other/path/here/cpedthing.txt
12
Jörg Beyer
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"
12
Javier

私がUnixフォーラムで見てテストしたように、これは問題を解決します

ptouch() {
    for p in "$@"; do
        _dir="$(dirname -- "$p")"
        [ -d "$_dir" ] || mkdir -p -- "$_dir"
    touch -- "$p"
    done
}
2
Fabian Rios
if [ ! -d /my/other ]
then
   mkdir /my/other/path/here
   cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
fi
2
Barun Parichha

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は、ディレクトリが既に存在する場合にエラーが返されるのを防ぎます(これは私がここで探しているものです:))

1
tediffer3rd

同じディレクトリ階層を再作成しようとする特殊な(ただし珍しいことではない)場合、cp --parentsが役立ちます。

たとえば、/my/longにソースファイルが含まれていて、my/otherが既に存在する場合、これを行うことができます。

cd /my/long
cp --parents path/here/thing.txt /my/other
1
Todd Owen