이름에 공백이 있는 파일 목록에서 디렉터리를 만듭니다.

이름에 공백이 있는 파일 목록에서 디렉터리를 만듭니다.

파일 목록이 포함된 디렉터리가 있습니다. 이러한 파일은 모두 이름에 공백이 있습니다.

확장자를 제외하고 파일 이름을 포함하는 각 파일에 대한 디렉터리를 만들고 싶습니다(모든 파일의 확장자는 .doc입니다).

예를 들어:

내 디렉토리 내용

first file.doc 
second file.doc 
third file.doc

예상되는 결과

first file/first file.doc 
second file/second file.doc
third file/third file.doc

생성해야 하는 디렉터리 이름을 확인하려면 다음 명령을 사용하세요.

find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'

결과는 다음과 같습니다.

first file
second file
third file

각 항목에 대해 디렉터리를 만들어야 한다는 것을 이해합니다.

나는 성공하지 않고 다음을 시도했습니다.

find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}' -exec mkdir '{}' \;
#error with awk: it cannot open the file -exec because it does not exist

mkdir `find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'`
#it creates several directories per name because there are spaces in the names

mkdir `"find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'"`
#-bash: find . -maxdepth 1 -name *.doc | awk -F .doc '{print }': command not found

mkdir "`find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'`"
#it tries to create a unique directory with all the file names as a single name, which is not good of course

가능하다면 파일 이름에서 모든 공백을 제거하고 싶지만 프로젝트 제약 조건에 맞게 유지해야 합니다.

이러한 디렉터리를 만들 수 있게 되면 일치하는 디렉터리에 있는 모든 파일을 이동하는 방법을 알아내야 합니다. 이 모든 작업은 하나의 명령으로 수행할 수 있습니다.

저는 bash와 RedHat 2.6을 사용하고 있습니다.

당신의 도움을 주셔서 감사합니다. 로랑

답변1

그리고 zsh:

mkdir -p -- *.doc(:r)

또는:

for f (*.doc) {
  mkdir -p -- $f:r &&
    mv -- $f $f:r/
}

동등함 bash(모든 POSIX 쉘에서도 작동하지만 zsh):

for f in *.doc; do
  mkdir -p -- "${f%.*}" &&
    mv -- "$f" "${f%.*}/"
done

(숨겨진 파일은 포함되지 않으니 주의하세요)

답변2

파일/디렉터리 이름의 공백은 이름이 올바르게 인용되는 한 괜찮습니다.

find . -maxdepth 1 -name "*.doc" | while IFS= read -r f; do 
    mkdir -- "${f%.doc}"; 
done

답변3

cd /path/to/dir
(   set -- *\ *
    printf 'd="%s" ; mkdir ./"${d%%.doc}"\n' "$@"
) | . /dev/stdin

쉘 glob을 사용하여 서브쉘의 매개변수를 설정한 다음 printf를 사용하고 파이프에 데이터를 제공할 수 있습니다. 파이프를 스크립트 소스로 사용합니다.

각 디렉토리의 파일을 이동하려면 다음을 수행하십시오.

cd /path/to/dir
(   set -- *\ *
    printf 'f="%s" ; d="${f%%.doc}"
        mkdir ./"$d" ; echo "mv ./\"$f\" ./\"$d\"/\"$f\""\n' "$@"
) | . /dev/stdin

참고: 커밋하기 전에 출력을 테스트하기를 원하기 때문에 의도적으로 위 내용을 에코로 제한했습니다.

수정됨 - printf에 2% 백분율을 사용하는 것을 잊었습니다.

그런데, 나는 이것을 테스트했습니다:

% printf 'touch ./"%s file.doc"\n' first second third fourth fifth |
    . /dev/stdin
% ls
> fifth file.doc  first file.doc  fourth file.doc  second file.doc  third file.doc

% ( set -- *\ *
    printf 'f="%s" ; d="${f%%.doc}"
    mkdir ./"$d" ; mv ./"$f" ./"$d"\n' "$@"
) | . /dev/stdin

% ls
> fifth file  first file  fourth file  second file  third file

% cd fifth\ file ; ls
> fifth file.doc

관련 정보