Zend certified PHP/Magento developer

“ls -C” uses single-column or multi-column assuming narrow window

I’ve traditionally used ls -C to get multi-column format. If I pipe the output through another command (e.g., less), I need ls -C to override the default single-column format. For some reason, I’m finding right now that it sometimes gives single-column output, and sometimes multi-column output but assumes a narrow window.

Why doesn’t ls -C produce multi-column output and how can I get the multi-column output from ls * into stdout?

I am using Cygwin’s mintty. The information about the screen width is accurate:

$ echo $COLUMNS
192

Below are the results of ls *, ls -C *, and ls -C * applied to each top level subfolder individually.

With my mintty at 192 columns full screen, ls * produces the desired format:

Administrator@LAPTOP-XXXXXXX /c/Users
$ ls * # Same formatted output with ls -C *
'All Users'@  'Default User'@   desktop.ini*

Administrator:
'3D Objects'/         Downloads/              'My Documents'@                                                                                  Pictures/      'Start Menu'@
 AppData/             Favorites/               NTUSER.DAT*                                                                                     PrintHood@      Templates@
'Application Data'@   IntelGraphicsProfiles/   NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*                                        Recent@         Videos/
 Contacts/            Links/                   NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*   Roaming/        ntuser.dat.LOG1*
 Cookies@            'Local Settings'@         NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*  'Saved Games'/   ntuser.dat.LOG2*
 Desktop/             MicrosoftEdgeBackups/    NetHood@                                                                                        Searches/       ntuser.ini*
 Documents/           Music/                   OneDrive/                                                                                       SendTo@

Default:
 AppData/            'My Documents'@                                                                                  NetHood@
'Application Data'@   NTUSER.DAT*                                                                                     Pictures/
 Cookies@             NTUSER.DAT.LOG1*                                                                                PrintHood@
 Desktop/             NTUSER.DAT.LOG2*                                                                                Recent@
 Documents/           NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*                                        Roaming/
 Downloads/           NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*  'Saved Games'/
 Favorites/           NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*   SendTo@
 Links/               NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*                                       'Start Menu'@
'Local Settings'@     NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*   Templates@
 Music/               NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*   Videos/

Public:
 AccountPictures/   Desktop/   Documents/   Downloads/  'Foxit Software'/   Libraries/   Music/   Pictures/   Roaming/   Symantec/   Videos/   desktop.ini*   tmp/

User1:
'3D Objects'/         Documents/               Music/                                                                                          NetHood@    'Saved Games'/   ntuser.dat.LOG1*
 AppData/             Downloads/              'My Documents'@                                                                                  OneDrive/    Searches/       ntuser.dat.LOG2*
'Application Data'@   Favorites/               NTUSER.DAT*                                                                                     Pictures/    SendTo@         ntuser.ini*
 Contacts/            IntelGraphicsProfiles/   NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*                                        PrintHood@  'Start Menu'@
 Cookies@             Links/                   NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*   Recent@      Templates@
 Desktop/            'Local Settings'@         NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*   Roaming/     Videos/

User2:
'3D Objects'/         Documents/               Music/                                                                                          OneDrive/       SendTo@
 Anaconda3/           Downloads/              'My Documents'@                                                                                  Pictures/      'Start Menu'@
 AppData/             Favorites/               NTUSER.DAT*                                                                                     PrintHood@      Templates@
'Application Data'@   IntelGraphicsProfiles/   NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*                                        Recent@         Videos/
 Contacts/            Links/                   NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*   Roaming/        ntuser.dat.LOG1*
 Cookies@            'Local Settings'@         NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*  'Saved Games'/   ntuser.dat.LOG2*
 Desktop/             MicrosoftEdgeBackups/    NetHood@                                                                                        Searches/       ntuser.ini*

If I pipe the output through anything, e.g., cat , this is what I get single-column instead instead:

Administrator@LAPTOP-XXXXXXX /c/Users
$ ls -C * | cat
All Users@  Default User@  desktop.ini*

Administrator:
3D Objects/
AppData/
Application Data@
Contacts/
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
IntelGraphicsProfiles/
Links/
Local Settings@
MicrosoftEdgeBackups/
Music/
My Documents@
NTUSER.DAT*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NetHood@
OneDrive/
Pictures/
PrintHood@
Recent@
Roaming/
Saved Games/
Searches/
SendTo@
Start Menu@
Templates@
Videos/
ntuser.dat.LOG1*
ntuser.dat.LOG2*
ntuser.ini*

Default:
AppData/
Application Data@
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
Links/
Local Settings@
Music/
My Documents@
NTUSER.DAT*
NTUSER.DAT.LOG1*
NTUSER.DAT.LOG2*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NetHood@
Pictures/
PrintHood@
Recent@
Roaming/
Saved Games/
SendTo@
Start Menu@
Templates@
Videos/

Public:
AccountPictures/  Downloads/       Music/     Symantec/     tmp/
Desktop/      Foxit Software/  Pictures/  Videos/
Documents/    Libraries/       Roaming/   desktop.ini*

User1:
3D Objects/
AppData/
Application Data@
Contacts/
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
IntelGraphicsProfiles/
Links/
Local Settings@
Music/
My Documents@
NTUSER.DAT*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NetHood@
OneDrive/
Pictures/
PrintHood@
Recent@
Roaming/
Saved Games/
Searches/
SendTo@
Start Menu@
Templates@
Videos/
ntuser.dat.LOG1*
ntuser.dat.LOG2*
ntuser.ini*

User2:
3D Objects/
Anaconda3/
AppData/
Application Data@
Contacts/
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
IntelGraphicsProfiles/
Links/
Local Settings@
MicrosoftEdgeBackups/
Music/
My Documents@
NTUSER.DAT*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NetHood@
OneDrive/
Pictures/
PrintHood@
Recent@
Roaming/
Saved Games/
Searches/
SendTo@
Start Menu@
Templates@
Videos/
ntuser.dat.LOG1*
ntuser.dat.LOG2*
ntuser.ini*

I get a hybrid of the the single- and multi-column output if I ls each file/folder individually and pipe it to cat (if I don’t pipe to cat, I get the desired multi-column output formatted for width 192).

for file in *
do
   echo ' '
   echo $file
   ls -C "$file"
done | cat

Administrator
3D Objects/
AppData/
Application Data@
Contacts/
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
IntelGraphicsProfiles/
Links/
Local Settings@
MicrosoftEdgeBackups/
Music/
My Documents@
NTUSER.DAT*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NetHood@
OneDrive/
Pictures/
PrintHood@
Recent@
Roaming/
Saved Games/
Searches/
SendTo@
Start Menu@
Templates@
Videos/
ntuser.dat.LOG1*
ntuser.dat.LOG2*
ntuser.ini*

All Users
All Users@

Default
AppData/
Application Data@
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
Links/
Local Settings@
Music/
My Documents@
NTUSER.DAT*
NTUSER.DAT.LOG1*
NTUSER.DAT.LOG2*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NetHood@
Pictures/
PrintHood@
Recent@
Roaming/
Saved Games/
SendTo@
Start Menu@
Templates@
Videos/

Default User
Default User@

Public
AccountPictures/  Downloads/       Music/     Symantec/     tmp/
Desktop/          Foxit Software/  Pictures/  Videos/
Documents/        Libraries/       Roaming/   desktop.ini*

User1
3D Objects/
AppData/
Application Data@
Contacts/
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
IntelGraphicsProfiles/
Links/
Local Settings@
Music/
My Documents@
NTUSER.DAT*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NetHood@
OneDrive/
Pictures/
PrintHood@
Recent@
Roaming/
Saved Games/
Searches/
SendTo@
Start Menu@
Templates@
Videos/
ntuser.dat.LOG1*
ntuser.dat.LOG2*
ntuser.ini*
  <...This is a blank line, I have no idea why it is here...>
desktop.ini
desktop.ini*

User2
3D Objects/
Anaconda3/
AppData/
Application Data@
Contacts/
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
IntelGraphicsProfiles/
Links/
Local Settings@
MicrosoftEdgeBackups/
Music/
My Documents@
NTUSER.DAT*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TM.blf*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000001.regtrans-ms*
NTUSER.DAT{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.TMContainer00000000000000000002.regtrans-ms*
NetHood@
OneDrive/
Pictures/
PrintHood@
Recent@
Roaming/
Saved Games/
Searches/
SendTo@
Start Menu@
Templates@
Videos/
ntuser.dat.LOG1*
ntuser.dat.LOG2*
ntuser.ini*