Python에서 코드를 실행하려고 하는데 하위 폴더에 100개의 파일이 있기 때문에 사용할 수 있는 대체 대시 명령을 찾고 있습니다. 파일을 10개의 폴더로 그룹화하려고 하는데 Python 스크립트가 필요하지 않습니다. 방해가 되려고 .
내가 시도하는 명령은 "<()"로 인해 대시에서 작동하지 않으며 대안을 찾고 있습니다.
암호:
i=0;while read l;do mkdir folder$i;mv $l folder$((i++));done< <(ls|xargs -n10)
실수:
Syntax error: redirection unexpected
답변1
이 코드는 bash에서는 작동하지만 POSIX 쉘에서는 작동하지 않습니다. 왜냐하면 <()
명령 대체 형식은 이식 가능하지 않고 쉘이 Python 스크립트에서 호출될 때 /bin/sh
실행되는 bash(예 dash
: 많은 Debian 기반 시스템) 또는 bash
POSIX 모드가 아닌 것이 거의 확실하기 때문입니다. 또는 다른 기본 POSIX 쉘. 이는 다음과 같은 문제로 인해 매우 안전한 접근 방식은 아닙니다.질문구문 분석에 내재되어 있습니다 ls
.
또 다른 접근 방식은 다음과 같습니다.
k=0
for file in *; do
[ "$k" = 10 ] && k=0
mkdir -p folder"$k"
mv -- "$file" "folder$k"
k=$((k+1))
done
mkdir -p
모든 구현이 이 옵션을 지원하는 것은 아니므 로 이식성이 없다는 점에 유의하십시오 -p
(디렉토리가 이미 존재한다고 불평하지 마십시오) mkdir
. 이것이 문제인 경우 대상 디렉터리가 존재하는지 테스트하는 코드를 추가하거나 오류 메시지를 무시할 수 있습니다.
즉, Python 스크립트를 작성하는 경우 외부 셸을 호출하는 대신 Python에서 로컬로 이 모든 작업을 수행해야 합니다. Python에서 이 작업을 수행할 수 없는 이유는 없습니다. 다른 디렉터리에서 발생해야 한다고 언급했지만 전혀 문제가 되지 않습니다. Python 코드를 더 주의 깊게 살펴보고 Python에서 구현하는 것이 좋습니다.
예를 들어, 동일한 작업을 수행하는 Python 스크립트는 다음과 같습니다.
#!/usr/bin/env python3
import os
import shutil
import sys
# read the first argument into source_dir
source_dir = sys.argv[1]
dir_counter = 0
file_counter = 0
target_dir = os.path.join(source_dir, "folder")
for file_name in os.listdir(source_dir):
# If this is a file
if os.path.isfile(file_name):
file_counter += 1
# If this file number is a multiple of 10,
# change the target dir name
if file_counter % 10 == 0:
dir_counter += 1
target_dir = os.path.join(source_dir, "folder" + str(dir_counter))
# Create the dir if it doesn't exist
if not os.path.exists(target_dir):
os.mkdir(target_dir)
try:
shutil.move(file_name, target_dir)
except Exception as error_message:
print("Failed to move %s to %s with error %s" %
(file_name, target_dir, error_message))
그런 다음 소스 디렉터리를 인수로 사용하여 스크립트를 실행합니다.
foo.py /path/to/source/directory
이것은 특별히 우아한 Python 스크립트는 아니며 상당히 개선될 수 있다고 확신하지만 앞으로 무슨 일이 일어날지에 대한 아이디어를 제공할 것입니다.