Unix-폴더 및 파일 경로 생성


125

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

누구든지 이것에 대한 해결 방법으로 기능을 생각해 냈습니까?



파일 및 디렉토리 생성이 원자 적이어야하는 경우이 작업을 제공하는 파일 시스템을 작성해야합니다. 표준 Linux 파일 시스템에서는 불가능합니다.
Peter G.

@toop 나는이 질문이 이제 1 년 반 된 것으로 알고 있지만 최근에 몇 가지 답변이 이것에 병합되었습니다. 이런 종류의 일이 자주 필요하면 내 대답이 유용하다는 것을 알 수 있습니다 . (:-) 내가 허용 대답보다 유용 주장 싶지만, 여기 담당자 구걸하고 있지 않다)
조나단 라인 하트에게


@tdammers Q : "X는 어떻게하나요?" A는 "여기에 Y를 수행하는 방법이다"
헨리 Henrinson

답변:


139

&&두 개의 명령을 하나의 쉘 라인에 결합하는 데 사용하십시오 .

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

참고 : 이전에 나는의 사용을 권장 ;두 개의 명령을 구분을하지만 @trysis 지적으로 사용에 아마 더 나은 &&경우 때문에 대부분의 상황에서 COMMAND1실패 COMMAND2하거나 실행되지 않습니다. (그렇지 않으면 예상하지 못한 문제가 발생할 수 있습니다.)


16
아마도 더 나은 사용 &&과 마찬가지로, ;(즉, 디렉토리처럼 아직 존재하지, 너무, 실패) 첫 번째 명령이 실패 할 경우, 두 번째 명령은 여전히 실행됩니다. 함께 &&첫 번째 명령이 실패 할 경우, 두 번째 명령은 실행되지 않습니다.
trysis 2015-06-07

12
코드 예제의 지름길은 다음과 같습니다 mkdir -p /my/other/path/here && touch $_/cpredthing.txt.. 는 $_본질적으로 "마지막으로 실행 된 명령의 마지막 인수"로 확장됩니다.
Sgnl

4
@Sgnl yours는 틀림없이 정답입니다. 깨끗할뿐만 아니라 오류가 덜 발생합니다.
Choylton B. Higginbottom

3
나는 정말로 같은 매개 변수를 touch취 했으면한다 . -pmkdir
Ben174

86

먼저 모든 상위 디렉토리를 만들어야합니다.

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

사용하도록 변경 &&-어때?
조나단 라인 하트

1
@ BЈовић . (내가 그들을 게시하기 전에 테스트 일하려고 않습니다.)
조나단 라인 하트에게

2
@JonathonReinhart 테스트 했습니까? 나는 시도했지만 supertouch "/tmp/abc/def ghi/jkl mno.txt"실패했습니다. 모든 명령 dirname,, mkdirtouch오류가 발생했습니다.
devnull

2
@devnull 분명히 충분하지 않습니다. 젠장 당신의 공간 :-) 고정.
조나단 라인 하트

1
@JeremyIglehart 나는 그것을 좋아한다. mktouch그것은.
Jonathon Reinhart의

24

/ 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

1
이 gem 도구가 대체로 무시된다는 사실에 놀랐습니다-man install-설치가 더 나은 솔루션임을 보여줄 것입니다.
SC-SL

1
를 사용할 수도 -D /dev/null있는데, 이는 기억하기 더 쉽습니다.
wisbucky

14

이것이 내가 할 일입니다.

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

13
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"

1
익명의 사용자 dirname -z "$@" | xargs -0 mkdir -p가 성능 을 위해 대신 사용할 것을 제안했습니다 (편집을 통해) . (숨어있는 것을 멈추고, 피트를 위해 가입하세요! ;-)
jpaugh

11

두 단계로 수행 할 수 있습니다.

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

2
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

내가 유닉스 포럼에서보고 테스트했듯이 이것은 문제를 해결합니다.

ptouch() {
    for p in "$@"; do
        _dir="$(dirname -- "$p")"
        [ -d "$_dir" ] || mkdir -p -- "$_dir"
    touch -- "$p"
    done
}

1

if then진술이 필요하지 않습니다 ... 한 줄로 할 수 있습니다 usign;

mkdir -p /my/other/path/here;cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

-또는 두 줄로-

mkdir -p /my/other/path/here
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

- -p디렉토리가 이미 존재하는 경우 오류가 반환 되는 것을 방지합니다 (내가 여기에서 찾아온 것입니다 :))


1

동일한 디렉터리 계층 구조를 다시 만들려는 특수한 경우 (흔하지 않은 경우는 아님) cp --parents가 유용 할 수 있습니다.

예를 들어 /my/long소스 파일이 포함되어 있고 my/other이미있는 경우 다음을 수행 할 수 있습니다.

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

-4

단 하나의 매개 변수 스 니펫으로 간단하게하려면 다음을 수행하십시오.

rm -rf /abs/path/to/file;  #prevent cases when old file was a folder
mkdir -p /abs/path/to/file; #make it fist as a dir
rm -rf /abs/path/to/file; #remove the leaf of the dir preserving parents 
touch /abs/path/to/file; #create the actual file

3
지난 몇 시간 동안의 작업을 단순히 없애고 싶다면 '† 몇 가지 rm -rf명령을 조심스럽게 버리십시오 . — † 즉, 합리적인 버전 제어 / 백업 정책을 준수한다고 가정하면 몇 시간입니다 . 그렇지 않으면 몇 달이 걸릴 수 있습니다.
leftaroundabout

1
rm -rf적절한 설명과 경고없이 제안해서는 안됩니다.
Mausy5043
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.