文件名和文件全局

时间:2014-12-11 01:30:19

标签: linux bash match filenames glob

我正在努力找出问题,这非常有帮助Linux file names & file globbing 但我仍有问题。

我的linux系统中的目录中有超过一百万个文件。我需要将文件名小于或等于某个数字的文件复制到另一个目录。 例如:

将所有文件名小于或等于29108273357520896的文件转到另一个目录。

有人可以帮我解决这个问题。 [] []让我很困惑。

2 个答案:

答案 0 :(得分: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

作为dir中带文件的单行

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

答案 1 :(得分:0)

您的问题可能会使用更多背景信息。具体来说,为什么你有一百万个文件?创造它们的是什么?虽然你可以使用一些shell脚本来处理这个问题,但是可能有一种更有效的方法,就是不要首先进入这个位置。