【问题标题】:Re-evaluating the for loop condition for each run重新评估每次运行的 for 循环条件
【发布时间】:2016-07-13 17:28:01
【问题描述】:

我有一个for 循环来列出目录中的文件,然后根据它们的名称,将它们移动到各种适当的文件夹中。

假设有 300 个文件,如下所示:

  1. Prefix_filename1_suffix1_date.txt - 100 个文件
  2. Prefix_filename101_suffix2_date.txt - 150 个文件
  3. Prefix_filename251_suffix3_date.txt - 50 个文件

我只会知道循环开始时文件的前缀和文件夹位置:

cd folder_location
for f in $(ls ${file_prefix}*); do

在我进入for 循环后,我会知道文件名——这是一个挑战。

我使用 regex 来查找所有文件共有的后缀,然后使用 awk 来获取前缀和后缀之间的文件名。所以要使用 regexawk 我需要文件名通过 for 循环。

在处理这些文件时,我将所有相似的文件一起移动,因此(如果有三组文件),这些文件可能会在 3 次运行中移动(比如说第 1、101 和 251 次),而其他 297 次运行则不要'不做任何事情,因为没有要处理的文件,因为它列出了 300 个文件——最初循环运行了 300 次。

如何避免这种情况?并使循环仅运行 3 次。

【问题讨论】:

  • 你能发布你的for循环吗?
  • for f in $(ls ${file_prefix}*);做
  • 我在 for 循环之前做了一个 cd folder_location
  • “进入 for 循环后我会知道文件名”是什么意思?
  • 我使用正则表达式查找所有文件通用的后缀,然后使用 awk 获取前缀和后缀之间的文件名。因此,要使用正则表达式和 awk,我需要文件名通过 for 循环

标签: bash shell unix for-loop


【解决方案1】:

假设文件名在给定的地方只有那些下划线(不在前缀名称后缀中),只需@ 987654321@ 第三个字段(即后缀)和sort -u,我们有我们的三个后缀。通过管道将其传送到一个循环,并将匹配的文件mv 传送到它们的 ad hoc 子目录。

cd folder_location
echo ${file_prefix}*.txt | cut -d '_' -f 3 | sort -u | \
while read suffix ; do
    [ -d ${suffix} ] || mkdir ${suffix}
    mv ${file_prefix}*_${suffix}_*.txt ${suffix}/
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多