2014-12-11 2 views
0

Я пытаюсь найти проблему, и это было очень полезно Linux file names & file globbing , но у меня все еще есть проблемы.Имя файла и файл Globbing

У меня есть более миллиона файлов в моем каталоге в моей Linux-системе. И мне нужно скопировать файл с именем файла меньше или равным определенному номеру в другой каталог. Например:

cp все файлы с именем файла или эквивалентом номера 29108273357520896 другим реквизитам.

Может кто-нибудь помочь мне с этим немного. [] [] Меня много смущает.

+1

Не делать это с глотанием. Используйте 'if [[$ filename <$ limit]]'. – Barmar

+4

BTW, помещая миллион файлов в один каталог, как правило, не является хорошей идеей. Файловые системы Unix обычно не подходят для таких огромных каталогов. – Barmar

+0

Хорошо, я попробую, если. Что вы говорите, я должен иметь несколько подкаталогов и разбивать миллионы файлов в subdir? – Purpamine

ответ

1

Вы можете скопировать из dir1 в dir2 каждый файл, который существует между 0 - 29108273357520896 довольно легко:

#!/bin/bash 

declare -i maxval=29108273357520896 

function usage { 

cat >&2 << TAG 

Copy all files from 'srcdir' to 'tgtdir' with numeric names less than 'maxname'. 

    Usage: "${0//*\//}" srcdir tgtdir [maxname] (maxname default: $maxval) 

TAG 

    exit 1 
} 

## test required input 
if [ -z "$1" -o -z "$2" ]; then 
    printf "\n error: insufficient input.\n" 
    usage 
fi 

## assign variables 
srcdir="$1" 
tgtdir="$2" 
declare -i maxname="${3:-$maxval}" # default maxval 

## validate srcdir 
if [ ! -d "$srcdir" ]; then 
    printf "\n error: source dir does not exist.\n" 
    usage 
fi 

## validate or create tgtdir 
[ -d "$tgtdir" ] || mkdir -p "$tgtdir" 
if [ ! -d "$tgtdir" ]; then 
    printf "\n error: tgtdir does not exist and cannot be created, check permissions.\n" 
    usage 
fi 

## validate maxname 
if [ $maxname -gt $maxval ]; then 
    printf "\n error: invalid 'maxname'. value exceeds maximum allowed: %s\n" "$maxval" 
    usage 
fi 

## for 0 - $maxname, check that file exists, if so copy to tgtdir 
for ((i=0; i<$maxname; i++)); do 
    [ -f "$i" ] && cp -a "${srcdir}/${i}" "${tgtdir}" 
done 

exit 0 

Как однострочника в директории с файлами

for ((i=0; i<29108273357520896; i++)); do [ -f "$i" ] && cp -a "$i" "/path/to/new/dir"; done 
+0

Спасибо за это, я многому научился из этого опыта. – Purpamine

0

Ваш вопрос может использовать больше контекста. В частности, почему у вас миллион файлов? Что их создает? Хотя вы можете использовать некоторые сценарии оболочки для работы с этим, может быть более эффективным способом, не попав в это положение в первую очередь.

+0

Файлы xml-файлы с твитами в них. Они были преобразованы из json в xml-файл для индексирования поисковой системы. – Purpamine

+1

Carlise - это ** NOT ** an ** Answer **. Это ** Комментарий **. StackOverflow - это ресурс, в котором ** Ответы ** предоставляют ** техническое решение ** для поставленной проблемы с кодированием. Ваш ** Комментарий ** не дает правильного технического решения ни для чего. В этом разница между диалогом ввода ** Ваш ответ ** и ссылкой ** добавить комментарий **. –

+0

@ DavidC.Rankin: Поскольку у Карлизы только одна точка репутации, он не видит ссылки «добавить комментарий» на вопросы других пользователей. – ruakh

Смежные вопросы