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

use*_*746 16 directory bash rename find

我的目录结构如下

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

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

Directory3\yetanotherfile1.jpg
          \yetanotherfile2.jpg
          \yetanotherfile3.jpg
Run Code Online (Sandbox Code Playgroud)

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

在上面的例子中:

  • file1.jpg将被重命名Directory1.jpg并放在文件夹旁边Directory1

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

  • yetanotherfile1.jpg将被重命名Directory3.jpg并放在文件夹旁边Directory3

我尝试过使用:

find . -name "*.jpg"
Run Code Online (Sandbox Code Playgroud)

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

这一行:

find . -name "*.jpg" -type f -exec ls "{}" +;
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激!

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

koj*_*iro 29

如果第一个意味着shell首先找到的shell(词法,但可能受到影响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
Run Code Online (Sandbox Code Playgroud)

概念证明:

$ 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
Run Code Online (Sandbox Code Playgroud)


小智 21

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

$ mv `ls | head -n 1` ..
Run Code Online (Sandbox Code Playgroud)

  • @Cyril [像这样用管道传送`ls`是个坏主意](https://unix.stackexchange.com/q/128985/44425) (2认同)