21

我的目录结构如下

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

4 回答 4

35

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

$ mv `ls | head -n 1` ..
于 2014-03-27T13:43:57.940 回答
30

如果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
于 2013-01-24T20:23:38.313 回答
2

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

find . -type d \! -name . -prune | while read d; do
    f=$(ls $d | head -1)
    mv $d/$f .
done
于 2013-01-24T20:36:36.553 回答
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/

注意:如果你传递一个无效的路径,它不会返回任何东西。

于 2019-08-12T23:48:58.973 回答