【问题标题】:Filename and File Globbing文件名和文件通配符
【发布时间】:2014-12-11 01:30:18
【问题描述】:

我正在尝试找出一个问题,这对我很有帮助 Linux file names & file globbing 但我仍然有问题。

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

cp所有文件名小于或等于数字29108273357520896的文件到另一个目录。

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

【问题讨论】:

  • 不要对通配符执行此操作。使用if [[ $filename < $limit ]]
  • 顺便说一句,将一百万个文件放在一个目录中通常不是一个好主意。 Unix 文件系统通常不太适合如此庞大的目录。
  • 好吧,我试试 if。您的意思是我应该有多个子目录并将百万个文件分区到子目录中?
  • 是的。您可能应该尝试将目录中的条目数保持在 10K 以下。
  • 所有的文件名都是数字吗?没有扩展?没有变化?只是数字?

标签: linux bash match filenames glob


【解决方案1】:

您可以相当轻松地将0 - 29108273357520896 之间存在的每个文件从dir1 复制到dir2

#!/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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这些文件是 xml 文件,其中包含推文。它们从 json 转换为 xml 文件以供搜索引擎索引。
    • Carlise - 这是不是一个答案。这是一个评论。 StackOverflow 是一个资源,其中 Answers 为提出的编码问题提供 技术解决方案。您的评论没有为任何事情提供正确的技术解决方案。这就是 Your Answer 输入对话框和 add a comment 链接之间的区别。
    • @DavidC.Rankin:由于 Carlise 只有一个声望点,他看不到其他用户问题的“添加评论”链接。
    • 该死,我确实忘记了。我向卡莉丝道歉。我想我只是对自上个学期开始以来一直伪装成答案的所有质量极差的 cmets 感到敏感......不过,该评论不应该作为答案发布。
    猜你喜欢
    • 2012-04-21
    • 2011-06-28
    • 1970-01-01
    • 2011-03-19
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多