programing

Unix - 폴더 및 파일 경로 만들기

newstyles 2023. 6. 3. 08:17

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

이것에 대한 해결책으로 기능을 생각해 낸 사람이 있습니까?

사용하다&&두 개의 명령을 하나의 셸 라인에 결합하는 방법

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

참고: 이전에 사용을 권장했습니다.;두 명령을 분리하지만 @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
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"

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

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

제가 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문...당신은 그것을 한 줄로 할 수 있습니다 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디렉터리가 이미 존재하는 경우 오류 반환을 방지합니다(이것이 제가 여기에 온 목적입니다:)).

동일한 디렉토리 계층을 다시 작성하려는 특별한 경우(비정상적인 경우는 아님),cp --parents유용할 수 있습니다.

예를 들어, 만약/my/long에는 원본 파일이 포함되어 있습니다.my/other이미 존재하는 경우 다음 작업을 수행할 수 있습니다.

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

하나의 매개 변수 스니펫으로 단순하게 하려면:

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

언급URL : https://stackoverflow.com/questions/9452935/unix-create-path-of-folders-and-file