命令行在目录中查找第一个文件

时间:2013-01-24 20:07:42

标签: bash directory find rename

我的目录结构如下

Directory1\file1.jpg
          \file2.jpg
          \file3.jpg

Directory2\anotherfile1.jpg
          \anotherfile2.jpg
          \anotherfile3.jpg

Directory3\yetanotherfile1.jpg
          \yetanotherfile2.jpg
          \yetanotherfile3.jpg

我正在尝试在ubuntu上的bash shell中使用命令行从每个目录中获取第一个文件并将其重命名为目录名称并将其向上移动一级以使其位于目录旁边。

在上面的例子中:

  • file1.jpg将重命名为Directory1.jpg并放在文件夹Directory1

  • 旁边
  • anotherfile1.jpg将重命名为Directory2.jpg并放在文件夹Directory2旁边

  • yetanotherfile1.jpg将重命名为Directory3.jpg并放在文件夹Directory3

  • 旁边

我尝试过使用:

find . -name "*.jpg"

但它没有按顺序列出文件(我需要第一个文件)。

这一行:

find . -name "*.jpg" -type f -exec ls "{}" +;

以正确的顺序列出文件但是如何只选择每个目录中的第一个文件并将其向上移动一级?

任何帮助将不胜感激!

编辑:当我引用第一个文件时,我的意思是每个jpg从0编号到该文件夹​​中的多个文件 - 例如:file1,file2 ...... file34,file35等...另一个要提的是文件的格式是随机的,所以编号可能从0或1a或1b等开始......

4 个答案:

答案 0 :(得分:23)

如果 first 表示shell glob首先找到的内容(词法,但可能受LC_COLLATE影响),那么这应该有效:

for dir in */; do
    for file in "$dir"*.jpg; do
        echo mv "$file" "${file%/*}.jpg" # If it does what you want, remove the echo
        break 1
    done
done

概念证明:

$ mkdir dir{1,2,3} && touch dir{1,2,3}/file{1,2,3}.jpg
$ for dir in */; do for file in "$dir"*.jpg; do echo mv "$file" "${file%/*}.jpg"; break 1; done; done
mv dir1/file1.jpg dir1.jpg
mv dir2/file1.jpg dir2.jpg
mv dir3/file1.jpg dir3.jpg

答案 1 :(得分:19)

你可以进入每个目录并运行:

$ mv `ls | head -n 1` ..

答案 2 :(得分:1)

查找所有第一级目录,识别此目录中的第一个文件,然后将其向上移动一级

find . -type d \! -name . -prune | while read d; do
    f=$(ls $d | head -1)
    mv $d/$f .
done

答案 3 :(得分:0)

以最佳答案为基础,这是一个通用的bash函数,该函数仅返回解析为给定目录内文件的第一个路径:

getFirstFile() {
    for dir in "$1"; do
        for file in "$dir"*; do
            if [ -f "$file" ]; then
                echo "$file"
                break 1
            fi
        done
    done
}

用法:

# don't forget the trailing slash
getFirstFile ~/documents/

注意::如果您传递的路径无效,它将无提示地返回任何内容。