mv가 존재하지 않을 경우 이동시킬 디렉토리를 작성하는 방법이 있습니까?
따라서 내 홈 디렉토리에 있고 foo.c를 ~ / bar / baz / foo.c로 옮기고 싶지만 해당 디렉토리가 존재하지 않으면 해당 디렉토리가 자동으로 생성되도록하는 방법이 있습니까? 당신은 입력해야합니다
mv foo.c ~/bar/baz/
모든 것이 잘 될까요? 해당 디렉토리가 존재하는지 확인하고 mkdir 및 mv를 호출하지 않는지를 확인하는 간단한 bash 스크립트로 mv를 별칭으로 지정할 수있는 것처럼 보이지만 누군가 더 나은 아이디어가 있는지 확인하려고 생각했습니다.
이 하나의 라이너 (bash에서)는 어떻습니까?
mkdir --parents ./some/path/; mv yourfile.txt $_
세분화 :
mkdir --parents ./some/path
디렉토리 (모든 중간 디렉토리 포함)를 생성 한 후 다음을 수행합니다.
mv yourfile.txt $_
파일을 해당 디렉토리로 이동합니다 ($ _는 이전 쉘 명령에 전달 된 마지막 인수, 즉 새로 작성된 디렉토리로 확장됩니다).
다른 쉘에서 이것이 얼마나 멀리 작동하는지 잘 모르겠지만 찾을 대상에 대한 아이디어를 줄 수 있습니다.
이 기술을 사용한 예는 다음과 같습니다.
$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt
mkdir -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt
mv 또는 mv.sh라는 스크립트로 저장
#!/bin/bash
# mv.sh
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"
또는 ~ / .bashrc 파일의 끝에 새 터미널마다 기본 mv를 대체하는 함수로 넣으십시오. 함수를 사용하면 매번 스크립트 파일을 읽을 필요없이 bash가 메모리를 유지할 수 있습니다.
function mv ()
{
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"
}
이들은 Chris Lutz의 제출을 기반으로합니다.
당신은 사용할 수 있습니다 mkdir
:
mkdir -p ~/bar/baz/ && \
mv foo.c ~/bar/baz/
자동으로 수행하는 간단한 스크립트 (예상치 않음) :
#!/bin/sh
# Grab the last argument (argument number $#)
eval LAST_ARG=\$$#
# Strip the filename (if it exists) from the destination, getting the directory
DIR_NAME=`echo $2 | sed -e 's_/[^/]*$__'`
# Move to the directory, making the directory if necessary
mkdir -p "$DIR_NAME" || exit
mv "$@"
대답이 아니오 인 것 같습니다 :). 이 작업을 수행하기 위해 별명이나 기능을 만들고 싶지는 않습니다. 일회성이며 이미 mv
명령 을 입력하는 중이기 때문에 잘 작동하는 것을 발견했습니다.
mv *.sh shell_files/also_with_subdir/ || mkdir -p $_
경우 mv
(디렉토리가 존재하지 않음)에 실패, 그것은 (그래서, 이전 명령의 마지막 인자 디렉토리를 만들 것입니다 $_
그것이있다). 따라서이 명령을 실행 한 다음 up다시 실행하면 이번에 mv
는 성공합니다.
아마도 다음 쉘 스크립트?
#!/bin/sh
if [[ -e $1 ]]
then
if [[ ! -d $2 ]]
then
mkdir --parents $2
fi
fi
mv $1 $2
이것이 기본 부분입니다. 인수를 확인하기 위해 비트를 추가 할 수도 있고 대상이 존재하거나 소스 디렉토리가 존재하지 않거나 존재하지 않는 경우 (예 : 존재하지 않는 것을 덮어 쓰지 않는 경우) 동작을 변경하고자 할 수 있습니다. .
가장 간단한 방법은 다음과 같습니다.
mkdir [directorie name] && mv [filename] $_
다운로드 디렉토리 (~ / download)에있는 pdf 파일을 다운로드했다고 가정하고 종료되지 않는 디렉토리 ( "my_PDF"라고 말함 ) 로 이동하려고합니다 .
다음 명령을 입력합니다 (현재 작업중인 디렉터가 ~ / download인지 확인).
mkdir my_PDF && mv *.pdf $_
다음과 같이 서브 디렉토리를 작성하려는 경우 mkdir에 -p 옵션을 추가 할 수 있습니다 ( "python"이라는 서브 디렉토리를 작성하려는 경우).
mkdir -p my_PDF/python && mv *.pdf $_
더 조용하지만 작동하는 방법 :
mkdir -p $2
rmdir $2
mv $1 $2
대상 파일 이름을 공유하는 임시 디렉토리를 포함하여 mkdir -p로 디렉토리를 작성한 후 간단한 rmdir로 해당 파일 이름 디렉토리를 제거한 다음 파일을 새 대상으로 이동하십시오. 나는 dirname을 사용하는 대답이 아마도 최고라고 생각합니다.
중괄호 확장을 사용할 수도 있습니다.
mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
- 3 개의 디렉토리 (directory1, directory2, directory3)를 작성합니다.
- 그리고 그들 각각에 두 개의 하위 디렉토리 (subdirectory1, subdirectory2),
- 그리고 그들 각각에는 두 개의 서브 서브 디렉토리 (subsubdirectory1 및 subsubdirectory2)가 있습니다.
- 그리고 그들 각각에 두 개의 하위 디렉토리 (subdirectory1, subdirectory2),
bash 3.0 이상을 사용해야합니다.
rsync를 명령은 트릭을 할 수있는 마지막 디렉토리 만 대상 경로가의 대상 경로에 대한 예를 들어, 존재하지 않는 ~/bar/baz/
경우 bar
존재하지만 baz
, 다음 명령을 사용할 수 없습니다 :
rsync -av --remove-source-files foo.c ~/bar/baz/
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
--remove-source-files sender removes synchronized files (non-dir)
이 경우 baz
디렉토리가 없으면 작성됩니다. 그러나 두 경우 bar
와 baz
rsync를 존재하지 않는 오류가 발생합니다 :
sending incremental file list
rsync: mkdir "/root/bar/baz" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]
따라서 기본적 rsync -av --remove-source-files
으로에 대한 별칭 으로 사용 하는 것이 안전해야합니다 mv
.
$what=/path/to/file;
$dest=/dest/path;
mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"
내 하나의 문자열 솔루션 :
test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/
암호:
if [[ -e $1 && ! -e $2 ]]; then
mkdir --parents --verbose -- "$(dirname -- "$2")"
fi
mv --verbose -- "$1" "$2"
예:
인수 : "d1" "d2 / sub"
mkdir: created directory 'd2'
renamed 'd1' -> 'd2/sub'
명령을 연결할 수 있습니다 : mkdir ~/bar/baz | mv foo.c ~/bar/baz/
또는 쉘 스크립트는 다음과 같습니다.
#!/bin/bash
mkdir $2 | mv $1 $2
1. 텍스트 편집기를 엽니 다
. 2. 셸 스크립트를 복사하여 붙여 넣습니다 .
3. mkdir_mv.sh 로 저장하십시오
. 4. 스크립트 디렉토리를 입력 하십시오. cd your/script/directory
5. 파일 모드 변경 : chmod +x mkdir_mv.sh
6. 별명 설정 : alias mv="./mkdir_mv.sh"
명령을 실행할 때마다 mv
디렉토리 이동이 없으면 작성됩니다.
((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))
'Programing' 카테고리의 다른 글
Android 가상 장치를 만들 수 없습니다 (0) | 2020.04.13 |
---|---|
기본 키는 MySQL에서 자동으로 색인됩니까? (0) | 2020.04.13 |
만료 키가있는 Java 시간 기반 맵 / 캐시 (0) | 2020.04.13 |
vi에서 한 파일의 내용을 다른 파일로 복사하여 붙여 넣기 (0) | 2020.04.13 |
PHP로 메모리를 비우는 데 더 좋은 점 : unset () 또는 $ var = null (0) | 2020.04.13 |